Java 当<&燃气轮机&引用';%;()被移除了吗?

Java 当<&燃气轮机&引用';%;()被移除了吗?,java,sql,hibernate,jsp,sql-injection,Java,Sql,Hibernate,Jsp,Sql Injection,我刚刚偶然发现了一位同事的一些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 + "'"); 除了服务器端验证某些非

我刚刚偶然发现了一位同事的一些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'或'x'='x
您永远不应该通过字符串连接创建查询。使用
query.setParameter(“paramName”,paramValue);

所以应该是这样的
Query q = em.createQuery("select object(u) from User as u where u.name =:name");
q.setParameter("name", "O'Reilly")

因为转义值,所以不可能进行SQLInjections;

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


在否决之前,请阅读问题。或者给出一个利用漏洞的例子。

您如何处理名为O'Reilly的用户?强制XKCD链接如果em代表EntityManager,这可能意味着您有可能正在使用JPA。实际上,如果您直接使用JPA或Hibernate并不重要,那么他究竟为什么要连接如何处理这样的SQL语句?请改用
Query
提供的方法,让框架管理清理。@Olaf O'Reilly不是allowed@Terence:哦,真的吗?;-)很好的重构,但看看我原来的问题。我问前一个问题如何可以(或者可能不能)被利用。请记住,不是我,而是我的同事。我从未尝试向hibernate查询添加“或1=1”,但您可以尝试一下。SQL注入漏洞不太依赖于返回的结果(最坏的情况是scenero-DB dump或drop xD)通过查询返回,但在使用结果集执行的操作上返回。因此,是的,在您的示例中,您可以始终提供
u.name
作为名称-这将从具有名称(名称不为null)的DB返回所有用户。问题是,你以后要用它做什么。也许你通过邮件将用户密码返回到提供的电子邮件中,这里是所有密码-这只是一个愚蠢的示例,但可能是。输入u.name(在原始post sql中)将被视为一个字符串而不是一个列为什么要这样做?只是自找麻烦。当jr dev复制粘贴将来编辑此代码时,你会怎么做?不。我投票支持你,不是因为我同意,而是为了鼓励讨论。