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

Chr*_*urm 4 java sql postgresql jdbc

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

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

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

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

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

非常感谢提前.

Bri*_*new 6

你见过JDBC NamedParameterJDBCTemplate吗?

NamedParameterJdbcTemplate类添加了对使用命名参数编写JDBC语句的支持(而不是仅使用经典占位符('?')参数编写JDBC语句.

你可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

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