我只是偶然发现了一个同事的一些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
答案 0 :(得分:2)
您永远不应该通过字符串连接创建查询。使用query.setParameter("paramName",paramValue);
所以它会是那样的
Query q = em.createQuery("select object(u) from User as u where u.name =:name");
q.setParameter("name", "O'Reilly")
由于转义值,没有SQLInjection可能;
答案 1 :(得分:0)
回答我自己的问题......这是安全的,但不像我自己所说的那样实用。
在低估这个之前,请阅读问题。或者给出一个漏洞利用示例。