我想允许用户选择随机的%记录。比如10%或20%或者介于两者之间。我尝试使用准备好的声明:
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
con = cpds.getConnection();
stmt = con.prepareStatement("SELECT TOP ? PERCENT Table.Name, FROM Table"
" WHERE Table.Color = ?"+
stmt.setString(1, percentVal);
stmt.setString(2, colorVal);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {con.close();} catch (SQLException e1) {}
try {rs.close();} catch (SQLException e1) {}
try {stmt.close();} catch (SQLException e1) {}
}
但是我得到了一个nullpointerexception。
我所知道的工作是
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
con = cpds.getConnection();
stmt = con.prepareStatement("SELECT TOP "+percentVal+" PERCENT Table.Name, FROM Table"
" WHERE Table.Color = ?"+
stmt.setString(1, colorVal);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {con.close();} catch (SQLException e1) {}
try {rs.close();} catch (SQLException e1) {}
try {stmt.close();} catch (SQLException e1) {}
}
但是我觉得这很容易被sql注入?对于如何做到这一点有一个很好的做法吗?
答案 0 :(得分:0)
预编译的服务器端预处理语句旨在提高效率,减少开销并防止注入。 但它们可能不是为处理SELECT子句中的占位符而设计的。例如,MySQL在此处指定了有关有效占位符位置的一些详细信息:https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
检查特定数据库和驱动程序的规格,确认其是否有效。
除此之外,您将对用户的输入进行一些验证,以避免由超出范围的值(例如SELECT TOP 200 PERCENT)或非数字值(例如SELECT TOP ABC)引起的SQL错误百分)。鉴于此,您可以清理百分比数据并从那时起准备语句。