我注意到该函数会json_encode()
自动将反斜杠"
和'
值放在一起。我最初是通过在将字符串放入数组之前使用来防止 SQL 注入mysqli_real_escape_string($con, $value)
,之后将使用 JSON 对其进行编码。
因为json_encode
添加了额外的反斜杠,所以有必要使用该mysqli_real_escape_string
功能吗?
我注意到该函数会json_encode()
自动将反斜杠"
和'
值放在一起。我最初是通过在将字符串放入数组之前使用来防止 SQL 注入mysqli_real_escape_string($con, $value)
,之后将使用 JSON 对其进行编码。
因为json_encode
添加了额外的反斜杠,所以有必要使用该mysqli_real_escape_string
功能吗?
是的,它仍然是必要的。json_encode
将反斜杠添加到 JSON 中包含的字符串,但不添加到 JSON 本身的控制元素。
所以这:
array( 'key' => 'some "value" here' );
变成:
{"key": "some \"value\" here"}
字符串中仍有未转义的引号(键和值周围的引号。json_encode
并不是为了防止 SQL 注入。它纯粹为 JSON 添加斜线,因此当您稍后处理json_decode()
数据时,它知道字符串开始和停止的地方。
正如其他人所说 - 使用准备好的陈述。时期。如果您已经在使用 mysqli,那么您没有理由不使用。
如果您使用的是 mysqli,只需使用 Prepared Statements 即可。
json_encode() 和 mysqli_real_escape_string() 都不能防止 SQL 注入。
此外,如果您不在 json 编码值中使用 mysqli_real_escape_string(),您将无法将它们解码回来。
此外,如果您将 json 存储在数据库中,那么您的数据库结构是错误的。
您正在使用您的数据库的表就是这样的数组。它们旨在将标量值存储在其单元格中。
json_encode
对 XSS 或 SQL 错误生成的保护不足。将对象编码为 JSON 的行为甚至会添加新的引号字符。
…但不要使用mysqli_real_escape_string
,使用准备好的语句和参数化查询。
…通常你不应该将 JSON 存储在数据库中。规范化您的数据,以便您可以查询它。