我有一个带有 where 条件、order by 和 limit 的查询。我正在使用准备好的语句来设置 where 条件和限制。目前我正在使用字符串追加来排序,这会导致 SQL 注入(inject)漏洞。
我不能像这样使用 set string 来排序 order by ? ?
如果我这样做,SQL 订单功能将无法工作。
示例查询:
SELECT siteid, technology, address, state, status FROM archive LEFT OUTER
JOIN mappings ON siteid = child_site_id order by siteid asc limit ? offset ?
SELECT siteid, technology, address, state, status FROM archive LEFT OUTER
JOIN mappings ON siteid = child_site_id order by siteid asc limit 10 offset 0
我可以通过任何其他方式来避免 SQL 注入(inject)。
最佳答案
PreparedStatement SetMethods仅适用于数据库表列值(SELECT
和 DELETE
SQL 语句的 WHERE
子句值,还包括要更新或插入的列值UPDATE
和 INSERT
语句)。
因此,这意味着以下常见的 SQL 部分,如列名、表模式、表名、ORDER BY、GROUP BY、分页( LIMIT 、 OFFSET 、 FETCH FIRST 等)不能通过问号符号( ?
) java.sql.PreparedStatement
直接将用户输入的值附加到查询中会导致安全缺陷,唯一的解决办法是检查 SQL 这些部分的有效值列表中的输入值。
例如您期望什么表名?特定表应该采用什么模式? ,特定表中存在哪些列? ,页码是整数吗?,LIMIT 值是整数吗? ORDER BY
子句的列名后的值只能是 ASC
或 DESC
,没有其他内容等等。
您可以动态填充这些有效值,也可以在系统中进行硬编码。
如果传递了无效值,那么我们要么不执行查询(并将其记录为错误),要么用有用的默认值替换无效值并执行查询。
关于java - 使用 Order by 准备好的语句来防止 SQL 注入(inject) java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48504315/