json_encode()是否可以防止SQL注入?

时间:2013-03-10 17:58:39

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

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

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

4 个答案:

答案 0 :(得分:3)

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

所以,这个:

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

变为:

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

字符串中仍有引号未被转义(键和值周围的引号。json_encode并不意味着防止SQL注入。它仅为JSON添加斜杠,所以当你,稍后,json_decode()数据,它知道字符串的开始和停止位置。

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

答案 1 :(得分:3)

如果您使用的是mysqli,只需使用准备好的语句就可以了。

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

...但请勿使用mysqli_real_escape_string,请使用prepared statements and parameterized queries

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