【发布时间】:2013-08-06 14:59:48
【问题描述】:
我刚刚偶然发现了一个同事的一些 SQL 代码(我们有一个“如果它没有破坏策略,请不要修复它”),用于登录过程。 name 变量由 JSP 中的输入字段提供。
//BAD CODING ALERT: DONT USE THIS CRAPPY CODE, YOU NAUGHTY COPY PASTERS!
Query q = em.createQuery("select object(u) from User as u where u.name = '" + name + "'");
除了服务器端对某些非法字符进行验证之外,name 变量上根本没有任何卫生设施:<>"'%;()(请注意这是单引号和双引号)
这可以被利用吗?如果是,那又如何?
如果不是单引号和双引号,可以这样做:blah' OR 'x'='x
【问题讨论】:
-
您将如何处理名为 O'Reilly 的用户?
-
强制 XKCD 链接 xkcd.com/327
-
如果 em 代表 EntityManager,这可能意味着您可能正在使用 JPA。直接使用 JPA 还是 Hibernate 并不重要,那么他到底为什么要连接这样的 SQL 语句呢?请改用
Query提供的方法,并让框架管理清理。 -
@Olaf O'Reilly 不允许
-
@Terence:哦,真的吗? ;-)
标签: java sql hibernate jsp sql-injection