java - 使用 Order by 准备好的语句来防止 SQL 注入(inject) java

标签 java prepared-statement sql-injection

我有一个带有 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仅适用于数据库表列值(SELECTDELETE SQL 语句的 WHERE 子句值,还包括要更新或插入的列值UPDATEINSERT 语句)。

因此,这意味着以下常见的 SQL 部分,如列名、表模式、表名、ORDER BY、GROUP BY、分页( LIMIT 、 OFFSET 、 FETCH FIRST 等)不能通过问号符号( ? ) java.sql.PreparedStatement

直接将用户输入的值附加到查询中会导致安全缺陷,唯一的解决办法是检查 SQL 这些部分的有效值列表中的输入值。

例如您期望什么表名?特定表应该采用什么模式? ,特定表中存在哪些列? ,页码是整数吗?,LIMIT 值是整数吗? ORDER BY 子句的列名后的值只能是 ASCDESC,没有其他内容等等。

您可以动态填充这些有效值,也可以在系统中进行硬编码。

如果传递了无效值,那么我们要么不执行查询(并将其记录为错误),要么用有用的默认值替换无效值并执行查询。

关于java - 使用 Order by 准备好的语句来防止 SQL 注入(inject) java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48504315/

相关文章:

java - 从 Spring Controller 中的 PostConstruct 方法获取服务器名称

php - 通过准备好的语句输入数据库的文字引号包含前面的反斜杠

javascript - 防止node-oracledb中的SQL注入(inject)

asp-classic - SQL注入(inject)这么好

azure - Azure 函数中针对 Cosmos DB 的 SQL 注入(inject)

java - 在 Apache Tomcat 中部署应用程序时,应该将 application.properties 文件放在哪里?

java - 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

java - (Java) 使用 Math.acos 时 double 中出现奇怪的 NaN

c# - 准备好的语句 C# : Impossible casting of System. System.Data.SQLite.SQLiteParameter 上的 Data.SqlClient.SqlParameter 对象?

java - 像列名一样使用 MySQL