什么是将表名作为参数放入SQL查询的安全方法?您不能使用PreparedStatement将表名作为参数放入。使用Statement连接字符串以执行具有动态表名的查询是可能的,但由于SQL注入的风险,不建议这样做。最佳方法是什么?
例如,在 MySQL 中,表名的分隔符是反引号字符,我们通过简单地将其加倍来转义它。
如果您的查询是 SELECT foo from bar
,您可以将查询重写为:
String query = String.format("SELECT foo from `%s`", tableName.replace("`", "``"));
这样做可以注入表名,而不必担心被注入恶意代码的风险。
"table'; GRANT ......; PRINT '......"
,为了使其起作用,还应检查tablename变量是否包含除字母数字以外的其他字符... - Martin"table'; GRANT ......; PRINT '......"
, 它会把反引号中的内容作为表名使用。 - Nicolas FilottoSQLite
的知识,但是从 文档 中看到,你可以使用双引号或重音符号(为兼容 MySQL)来引用标识符,因此你可以使用相同的方法(加倍以转义)在两者中都适用。 - Nicolas FilottoString.format("SELECT foo from \"%s\"", tableName.replace("\"", "\"\""));
? - Bakus123