我可以信任JavaBean PropertyDescriptor.getName()吗?

时间:2016-03-08 16:39:06

标签: java security javabeans sql-injection

我有一个JavaBean类,在我的控制下,通过用户提供的数据填充。我正在使用Introspector.getBeanInfo(getClass()).getPropertyDescriptors()链,然后在每个属性描述符上调用PropertyDescriptor.getName(),以构造用于SQL查询的字段名称。

问题是,这是否会引入潜在的安全漏洞?例如,JavaBean规范是否允许用户控制允许SQL注入的getName()方法?

2 个答案:

答案 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注入问题(如果这符合我们的体系结构)。再假设,这是服务器端。