在 Hibernate 中检测注入
Posted
技术标签:
【中文标题】在 Hibernate 中检测注入【英文标题】:Detecting Injection in Hibernate 【发布时间】:2011-11-30 17:35:37 【问题描述】:我正在使用 Hibernate,我想防止注入到 Hibernate 准备好的语句中。 有没有一种简单的方法可以做到这一点? 问候, 哈米德
让我重新表述我的问题。 :-) 我的代码中有很多查询形式为:session.createQuery(...)。有两种查询。有 setParameters 的,没有的。后者的形式是:select * from XYZ where username = '" + username + "' and password = '" + password + "'" 这不适合我。现在,我的问题是如何自动找到第二种形式. 我有什么解决办法吗?
【问题讨论】:
Hibernate 只使用准备好的语句。你为什么在乎? 是的,但是某些查询仍然容易受到注入攻击。我想检测那些。 所以,这个问题不准确。您对 Hibernate 中的 Prepared Statements 不感兴趣。您想停止 SQL 注入。 你是对的。让我重新表述我的问题。 :-) 我的代码中有很多查询形式为:session.createQuery(...)。有两种查询。有 setParameters 的,没有的。后者的形式是:select * from XYZ where username = '" + username + "' and password = '" + password + "'" 这不适合我。现在,我的问题是如何自动找到第二种形式. 我有什么解决办法吗? 【参考方案1】:如果您将日志记录到 DEBUG,您可以看到 Hibernate 在做什么。它输出的语句表明它对准备好的语句做了什么,包括它何时重用它们。
【讨论】:
谢谢亚伦,但我不是那个意思。我想在运行时在我的代码中检查它们,而不是在日志级别。你能那样帮我吗? 不确定为什么要这样做,但是如果您在 Eclipse 中本地运行您的应用程序并附加了 Hibernate 源,您可以在 Debug 透视图中单步执行代码并查看它抓取的位置准备好的陈述。如果您正在寻找一种编程方式来做到这一点,我得到了 nuthin。 我想像这样过滤这些查询:“select * from XYZ where username = '” + username + “' and password = '” + password + “'”。你知道我的意思吗?【参考方案2】:您需要提高日志记录(请参阅@Aaron Sheffey)并打开 show sql。这是要设置的属性。
hibernate.show_sql=true
有关您可以执行的日志记录的更多详细信息,请参见此处:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging
以下 log4j 属性也会将 Hibernate 语句放入它们自己的文件中。
log4j.logger.org.hibernate=DEBUG, org.hibernate
log4j.appender.org.hibernate=org.apache.log4j.DailyRollingFileAppender
log4j.appender.org.hibernate.DatePattern=-yyyy-MM-dd-HH
log4j.appender.org.hibernate.File=$catalina.base/logs/hibernate.log
log4j.appender.org.hibernate.layout=org.apache.log4j.PatternLayout
log4j.appender.org.hibernate.layout.ConversionPattern=%ddd MMM yyyy HH\:mm\:ss,SSS [%t] %-5p %c %x - %m%n
【讨论】:
我为 Aaron 发表了评论,然后我决定将其放在这里。谢谢詹姆斯,但日志文件对我没有帮助。我希望在运行时进行检查,这样我就可以在我的代码中检测和操作这些查询。你能以这种方式给我一个提示吗? 没有。我会犹豫是否要进行这种操纵。如果如上所述,您担心 SQL 注入,我建议您确保在参数接近 Hibernate 之前正确转义参数。以上是关于在 Hibernate 中检测注入的主要内容,如果未能解决你的问题,请参考以下文章