选择百分比sql的准备语句

时间:2017-02-03 21:25:28

标签: java sql-server-2008

我想允许用户选择随机的%记录。比如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注入?对于如何做到这一点有一个很好的做法吗?

1 个答案:

答案 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错误百分)。鉴于此,您可以清理百分比数据并从那时起准备语句。