【问题标题】:Does json_encode() protect against SQL injections? [duplicate]json_encode() 是否可以防止 SQL 注入? [复制]
【发布时间】:2013-02-25 20:39:14
【问题描述】:

我注意到函数 json_encode() 自动在 "' 值上放置反斜杠。我最初是在将字符串放入数组之前使用mysqli_real_escape_string($con, $value) 来防止 SQL 注入,之后将使用 jSON 对其进行编码。

因为json_encode添加了额外的反斜杠,所以需要使用mysqli_real_escape_string函数?

【问题讨论】:

  • 不,它没有。因为那不是它的目的。
  • 我不会说这是重复的,这纯粹是针对json_encode()函数
  • 不是建设性的。有人总是想出各种解决方法来避免转义,无论是 htmlspecialchars 还是 addlashes 或 json_encode,就像在您的问题中一样。根据您的描述(mysqli_real_escape_string 然后 json_encode 的顺序非常错误),您似乎也不明白应该如何进行上下文转义。因此,为什么要提示绑定参数,这使得这一步变得多余。您避免使用更简单、更理智的方法的原因是什么?
  • 这不是重复的。可怜的家伙不值得投 3 票。

标签: php sql json sql-injection mysql-real-escape-string


【解决方案1】:

是的,它仍然是必要的。 json_encode 将反斜杠添加到 JSON 中包含的字符串,但不添加到 JSON 本身的控制元素。

所以,这个:

array( 'key' => 'some "value" here' );

变成:

{"key": "some \"value\" here"}

字符串中仍有未转义的引号(键和值周围的引号。json_encode 并不是为了防止 SQL 注入。它纯粹为 JSON 添加斜线,这样当您稍后, json_decode() 数据,它知道字符串在哪里开始和停止。

正如其他人所说 - 使用准备好的语句。时期。如果您已经在使用 mysqli,那么您没有理由不使用。

【讨论】:

    【解决方案2】:

    如果您使用的是 mysqli,只需使用 Prepared Statements 即可。

    【讨论】:

      【解决方案3】:

      json_encode() 和 mysqli_real_escape_string() 都不能防止 SQL 注入。

      此外,如果您不在 json 编码值中使用 mysqli_real_escape_string(),您将无法将它们解码回来。

      另外,如果您在数据库中存储 json,那么您的数据库结构是错误的。

      您正在使用您的数据库的表就是这样的数组。它们旨在将标量值存储在其单元格中。

      【讨论】:

        【解决方案4】:

        json_encode 对 XSS 或 SQL 错误生成的保护不足。将对象编码为 JSON 的行为甚至会添加新的引号字符。

        …但不要使用mysqli_real_escape_string,使用prepared statements and parameterized queries

        ...通常您不应该将 JSON 存储在数据库中。规范化您的数据,以便您可以查询它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多