我需要连接字符串来生成要执行的查询,主要是因为参数不能在我需要的地方使用。
例如,DB2 中的
FETCH NEXT <n> ROWS
子句不接受 JDBC 参数,而只接受字符串。以下代码崩溃:
int limit = 100;
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM EMPLOYEE ORDER BY SALARY FETCH NEXT ? ROWS ONLY"); // crashes
ps.setInt(limit);
当以下代码有效时:
int limit = 100;
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM EMPLOYEE ORDER BY SALARY FETCH NEXT " + limit
+ " ROWS ONLY"); // works
这在技术上是“SQL 注入”(我认为),但它是故意的,而且也是安全的。
有没有比“SQL 注入”更好的名称来描述这一点?我需要向保安人员解释这一点,我不想被咆哮。
您只是根据数据构建 SQL 语句。这不是 SQL 注入。如果您的
limit
变量来自外部,则会发生 SQL 注入。