0

我尝试创建一个 PreparedStatement:

stmt = conn.prepareStatement("SELECT POLBRP, POLTYP, POLNOP, INCPTP, TRMTHP, " +
            "CLTKYP , CANDTP, POLSTP, EXPRYP, OINCPP, CANRNP, PAYMDP,
            KCNFLP, KCRTSP, KACADP, KSCHMP, EXPRYP FROM " 
            + POLHDR + " WHERE POLNOP = " + idNumber + 
            " AND POLBRP = " + branch + " AND POLTYP = " + product + 
            " AND OINCPP <= "+date );

这会引发 SQLException: [SQL0206] Column AD not in specified tables。

我不知道它从哪里获取 AD 列,因为我从未在 select 子句中指定它(除非我完全盲目和愚蠢)

任何人都可以帮忙吗?

4

3 回答 3

4

如果您的变量是字符串,例如branch

" AND POLBRP = " + branch + " ...

然后你忘了引用值

" AND POLBRP = '" + branch + "' ...

但真正的解决方案是使用占位符

... AND POLBRP = ? ...

这将一劳永逸地防止此类问题,这就是 PreparedStatement 的设计目的

于 2013-01-30T14:58:49.433 回答
1

在 Java 中防止 SQL 注入显示了正确使用PreparedStatement

准备好的语句作为参数传递给准备好的语句的变量将被 JDBC 驱动程序自动转义。

示例:ps.1

String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();

来自同一来源,在同一部分中:

尽管 Prepared Statements 有助于防御 SQL 注入,但通过不恰当地使用 Prepared Statements 可能会引发 SQL 注入攻击。下面的示例解释了输入变量直接传递到 Prepared Statement 从而为SQL 注入攻击铺平道路的情况。

示例:ps.2

String strUserName = request.getParameter("Txt_UserName"); 
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
于 2013-01-30T15:00:02.897 回答
1

尝试将您的查询更改为:

SELECT
  POLBRP,
  POLTYP,
  POLNOP,
  INCPTP,
  TRMTHP,
  CLTKYP,
  CANDTP,
  POLSTP,
  EXPRYP,
  OINCPP,
  CANRNP,
  PAYMDP,
  KCNFLP,
  KCRTSP,
  KACADP,
  KSCHMP,
  EXPRYP
FROM TableName WHERE POLNOP = ? AND POLBRP = ? AND POLTYP = ? AND OINCPP <= ?";

然后使用:

stmt.setString(1, "ValueOfPOLNOP");
...

执行查询时,?将替换为您传递给PreparedStatement#setString(int, String)方法的值

于 2013-01-30T15:02:18.020 回答