【问题标题】:MySQL "INSERT" and SQL injectionMySQL "INSERT" 和 SQL 注入
【发布时间】:2014-10-16 19:50:07
【问题描述】:

我有这个简单的 mysql 查询:

INSERT INTO table (col1, col2) VALUES ('1', '2')

col1col2 是另一个表的外键,因此 col1col2 的任何值都必须存在于另一个表中,否则不会插入该行。

在这种情况下是否还有 SQL 注入的风险?如果我从 PHP POST 收到这些 col 值,我是否还需要在插入数据库之前绑定它们,或者它们已经是安全的,因为 cols 是外键?

【问题讨论】:

  • 只要使用正确的“准备好的”查询,很多“问题”就会消失。如果您总是使用带有“动态”参数的“准备”查询,那么您将是“安全的”。您必须“验证”所有输入,但如果“不常用的东西”进入数据库,则它不是“有害的”。首先,我并不担心“效率”。
  • 唯一可以接受的方法是,如果您知道输入中不可能包含恶意代码。不幸的是,如果您依赖最终用户的输入,甚至是现有的数据库值,那么您实际上无法知道这一点。出于所有实际目的,始终假设最终用户没有做好事,并且不要相信他们的任何输入都是干净的。

标签: mysql sql security sql-injection


【解决方案1】:

是的。用户的所有输入都需要检查是否已清理。例如。如果用户向您发送像 '2'); drop table <table> 这样的字符串作为您的第二个值,它可能会被执行并给您一些惊喜。 (字符串可能不完全有效,但我认为你明白了)

【讨论】:

  • 我不认为理智是你要找的词。用户的所有输入都需要进行清理。
  • 愚蠢的外语。但至少它很接近;)更新的答案。
【解决方案2】:

它确实很容易发生 SQL 注入,因为例如,用户可能会破坏您的查询并在错误消息中获取有关您的 RDBMS 和数据库架构的信息,并使用它来准备对您的应用程序的另一次攻击。

有很多方法可以探索 SQL 注入问题。

【讨论】:

    【解决方案3】:

    是的,即使有外键约束,也总是存在注入风险。如果我知道什么是有效的 col1 和 col2 值,我可以使用这些值来构造攻击。最好始终清除用户输入并假设用户试图损害您的数据库。

    【讨论】:

    • +1。这有多难实现可能完全是一个不同的话题(例如,如果外键是数字而不是 GUID/UUID,则可能更容易实现),但正确处理数据插入要容易得多。跨度>
    • 好吧,这取决于,如果密钥曾经暴露在某个地方,比如在下拉列表中,那么无论它们采用什么格式都很容易。但是,你是对的,如果密钥是从未在服务器广告 GUID/UUID 之外显示将很难破解。如果我不知道它们的键,但可以通过生成错误来获取约束上的表名,我可以执行“INSERT INTO table (col1, col2) VALUES ('1', (SELECT col2 FROM ) ); 删除表...."
    【解决方案4】:

    在 PHP 中构建数据库查询时,请使用允许您为数据使用占位符的接口,该占位符将自动处理任何转义。例如,您的查询如下所示:

    INSERT INTO table (col1, col2) VALUES (:col1, :col2)
    

    然后你可以在像 PDO 这样的驱动程序中使用适当的方法来绑定它。如果您对用户数据使用占位符很严格,那么发生 SQL 注入错误的可能性非常低。

    properly escape 用户输入有多种方法,但您必须确保将它们用于所有用户数据,没有例外。一个错误就足以让您的网站大开。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2013-02-27
      • 2021-06-06
      • 2017-08-24
      相关资源
      最近更新 更多