【问题标题】:How to prevent SQL injection from special characters [duplicate]如何防止特殊字符的SQL注入[重复]
【发布时间】:2017-11-22 20:20:19
【问题描述】:

我想保护 SQL 注入中的参数化 SQL 查询。我浏览了一篇文章,其中描述了使用 PreparedStatement 避免 SQL 注入。 link

根据文章,它描述preparedstament 有助于从缓存中选择预编译查询,并且在最后一步用用户数据替换花边,并且不会再次编译查询。因此,如果有人提供 sql 查询作为用户输入,将有助于避免 SQL 注入,因为该查询只会编译一次。

但是如果有人给出带有特殊字符的字符串,例如'x'='x',会发生什么。例如,当占位符在“SELECT * FROM users WHERE username = 'blah' AND password = 'foo' OR 'x'='x'”这样的最终查询中替换为“x”=“x”之类的用户数据时。 Java PreparedStatement 如何处理这些类型的特殊字符?

谁能帮我理解这个

【问题讨论】:

  • 准备好的语句不必处理这个,因为查询和数据是分开发送到服务器的。
  • 如果不是由您添加,应该如何添加 OR?
  • @YCF_L 阅读问题。在链接中,我添加了您指出的答案中包含的博客文章。我只问了我知道的缺失点
  • [...] 准备好的语句所做的是将其分为两部分。第一个是,I need you to pick someone up from the airport - 和 你应该接,你被告知单独。在这种情况下,这自然意味着你只需耸耸肩就走,“我不认识任何叫 Mary, and then kill yourself 的人”——就是这样,没有伤害。因为你知道你得到你的指令和数据(名称)来分别执行它,所以你没有可能将 data 的部分与 instruction 的部分混淆i>.

标签: java sql prepared-statement sql-injection


【解决方案1】:

基本上,数据库引擎使用占位符解析 SQL 字符串,并记住只有那部分会被执行。

完成此操作后,它将接受数据并将占位符替换为实际数据。

这意味着,如果有人设法将 SQL 字符串放入您的变量之一以破坏 SQL 并使其执行其他操作,则数据库引擎会将其视为不会执行的文本。

因此,您可能会将完整的 SQL 语句输入到文本字段中,它只会作为文本插入,而不是由数据库引擎解析和执行,因此,您的代码是“安全的”(总有一些东西你错过了可能是潜在漏洞的地方)

这也不是 JAVA 独有的,它也适用于 PHP 等,它只是告诉数据库以与通常不同的方式处理查询。

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2017-12-10
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2015-02-12
    • 2017-05-02
    • 2016-02-14
    相关资源
    最近更新 更多