我注意到函数json_encode()
会自动在"
和'
值上添加反斜杠。我最初在将字符串放入数组之前使用mysqli_real_escape_string($con, $value)
来防止SQL注入,之后它将使用jSON进行编码。
因为json_encode
添加了额外的反斜杠,所以必须使用mysqli_real_escape_string
函数吗?
答案 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存储在数据库中。规范化您的数据,以便查询它。