java – 如何从搜索表单动态构建WHERE子句时如何防止SQL注入?

我知道在Java中保护SQL查询以防止SQL注入的唯一正确方法是使用PreparedStatements.

但是,这样的声明要求基本结构(选定属性,连接表,WHERE条件的结构)不会变化.

我这里有一个JSP应用程序,其中包含一个包含大约十几个字段的搜索表单.但是用户不必填写所有这些 – 只需要他需要的那个.因此我的WHERE条件每次都不同.

我该怎么做才能阻止SQL注入?
逃避用户提供的值?编写一个包装类,每次都构建一个PreparedStatement?或者是其他东西?

数据库是PostgreSQL 8.4,但我更喜欢一般的解决方案.

非常感谢提前.

最佳答案
你见过JDBC NamedParameterJDBCTemplate吗?

The NamedParameterJdbcTemplate class
adds support for programming JDBC
statements using named parameters (as
opposed to programming JDBC statements
using only classic placeholder (‘?’)
arguments.

你可以这样做:

String sql = "select count(0) from T_ACTOR where first_name = :first_name";
SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
return namedParameterJdbcTemplate.queryForInt(sql, namedParameters);

并动态构建您的查询字符串,然后类似地构建您的SqlParameterSource.

转载注明原文:java – 如何从搜索表单动态构建WHERE子句时如何防止SQL注入? - 代码日志