java 中 preparedStatement 的 HP Fortify SQL 注入问题

HP Fortify SQL injection issue on preparedStatement in java

我正在使用 HP Fortify 来衡量我的 java 代码的代码质量。

HP Fortify 正在报告 SQL 注入 错误

PreparedStatement stmt = connnection.prepareStatement(queryString);

那么如何解决这个问题?

如果您不使用用户输入作为准备好的语句的参数,而是通过将字符串连接在一起来构建 SQL 命令,即使使用准备好的语句

根据我的经验,如果 HP Fortify 无法跟踪您用于将 queryString 构建为常量的所有字符串的来源,那么 HP Fortify 将在这种情况下报告错误。如果字符串的任何部分是从磁盘读取或作为请求参数传递的,那么您就有容易受到 SQL 注入攻击的风险。

推荐的解决方案是在构建 SQL 查询字符串时永远不要使用外部字符串。您的 SQL 字符串应该只从字符串常量构建,并且在运行时插入的每个参数都应该作为绑定变量插入,这意味着它的位置应该显示为“?”在 SQL 字符串中,其值应使用 PreparedStatement class.

的 setX() 方法设置

请注意,在 Java 中创建 PreparedStatement 时应始终使用绑定变量:这不仅是一种良好的安全实践,也是一种良好的性能实践,因为它不需要数据库重新解析 SQL 每次参数值变化时查询。