我有一个JavaBean类,在我的控制下,通过用户提供的数据填充。我正在使用Introspector.getBeanInfo(getClass()).getPropertyDescriptors()
链,然后在每个属性描述符上调用PropertyDescriptor.getName()
,以构造用于SQL查询的字段名称。
问题是,这是否会引入潜在的安全漏洞?例如,JavaBean规范是否允许用户控制允许SQL注入的getName()
方法?
答案 0 :(得分:1)
我不这么认为; getName()
必须返回有效的属性名称,并且属性名称不能包含对SQL有危险的字符('," ,;等)。
但是,无论如何,您都不应该信任用户输入。您永远不应将用户输入直接放入SQL查询中;你应该使用bind variables和Java prepared statements。至少,您应该escape SQL的所有用户输入,然后才能到达数据库附近。
答案 1 :(得分:0)
当你说
时允许用户控制getName()
这让我怀疑这是你的应用程序正在编写的客户端SQL吗?当然,不应该信任并直接在您的数据库上运行。 Further discussion is readily available
如果它是服务器端,我无法想象您的用户能够更改属性名称,除非您映射类似JSON的内容,并且像GSON
这样的库允许在某一半中使用无效的POJO属性名称反序列化状态。
在任何情况下,您都可以将这些Java对象映射到ORM工具,并避免SQL注入问题(如果这符合我们的体系结构)。再假设,这是服务器端。