我有在我试图创建一个基于IP user`s对API整个SQL的使用情况运行它。构建整个SQL和使用preparedStatement时
EG:用户点击API与格式/what/table/field/field_value?name=value1
public static Result getRows(String what, String table, String field, String field_value, String more_where_clause) throws SQLException {
//more_where_clause will have as many condition for where clause
String sql = String.format("select ? from ? where ?=?");
if (!where.equals("")) {
sql += String.format(" and ?");
}
ResultSet rs = targetDB.query(sql, what, table, field, field_value, more_where_clause);
public <T extends Comparable<T>>ResultSet query(String sql, T... args) throws SQLException {
ResultSet rs = null;
try{
preparedStatement = conn.prepareStatement(sql);
for(int i=0; i<args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
rs = preparedStatement.executeQuery();
}
catch(SQLException e)
{
e.printStackTrace();
}
return rs;
}
但是,当我查询它用说:
/name/user_table/first_name/john?last_name=doe
我得到一个SQL字符串像
select 'name' from 'user_table' where 'first_name'='john' and 'last_name=doe'
as preparedStatement.setObject(i + 1, args[i]);
推断它作为字符串。
什么是更好的方式来做到这一点,也避免SQL注入。 编辑: 除了参数化where子句部分之外,还可以进行其他额外的检查吗?如何处理more_where_clause,用户可以在where条件中输入更多内容。
如果您基本上让用户注入_everything_,包括表名(您不能将其作为绑定变量并需要连接到查询字面值中),则无法避免SQL注入。通常情况下,您只需让用户输入_values_列,然后您可以通过准备好的语句安全地进行清理。 –
所以我无法将它与bcoz绑定为相同的原因,即'user_table''额外'引号的'名称'。对? – user2601010
http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –