2

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

因为json_encode添加了额外的反斜杠,所以有必要使用该mysqli_real_escape_string功能吗?

4

4 回答 4

4

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

所以这:

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

变成:

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

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

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

于 2013-03-10T18:01:53.353 回答
3

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

于 2013-03-10T18:02:24.767 回答
2

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

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

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

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

于 2013-03-10T18:05:31.350 回答
1

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

…但不要使用mysqli_real_escape_string,使用准备好的语句和参数化查询

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

于 2013-03-10T18:02:54.787 回答