2013-08-06 29 views
-1

我只是偶然发现了一个同事的SQL代码(我们有一个”不修复它,如果它不破坏策略“),登录过程。 名称变量由一个输入字段从JSP在所有交付当<>“'%;()被删除时SQL注入是否可能?

//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

+3

你会如何处理O'Reilly这个名字的用户? – Olaf

+2

必须的XKCD链接http://xkcd.com/327/ –

+2

如果em代表EntityManager,那可能意味着您有可能使用JPA。实际上,如果您直接使用JPA或Hibernate,那么他究竟为什么要连接这样的SQL语句?相反,使用'Query'提供的方法,让框架管理消毒。 – Gamb

回答

0

回答我自己的问题......这是安全的,但不像我自己所说的那样实用。

在下调之前,请阅读该问题。或者给出一个利用例子,否则。

+0

为什么会这样?只是要求麻烦。你是否会在jr dev复制粘贴将来编辑此代码时执行此操作? – tgkprog

+0

@tgkprog现在够好了吗? – Terence

+1

没有。我向你投票,不是因为我同意,而是喜欢鼓励讨论。 – tgkprog

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") 
没有SQL注入可能因为转义值;

+0

非常好的重构,但看看我原来的问题。我问过以前可以(或者不能)被利用。并且不要介意这不是我,而是我的同事。 – Terence

+0

我从来没有尝试添加“OR 1 = 1”到休眠查询,但你可以试试看。 SQL注入漏洞在查询返回的结果(最糟糕的情况 - 数据库转储或丢失xD)上并不如此,而是取决于使用结果集进行的操作。 所以是的,在你的例子中,你总是可以提供'u.name'作为名字 - 这将返回具有名字的所有用户(名字不为空)。问题是,你以后在做什么。也许你把返回的用户密码发送给提供的电子邮件,这里是所有的密码 - 只是一个愚蠢的例子,但可能。 – Antoniossss

+0

输入u.name(在原始文章sql中)将被视为一个字符串而不是列 – Terence

相关问题