如果使用 json_encode,是否需要转义用户输入?
Escaping user input necessary if using json_encode?
如果我在 $_POST
和 json_encode 中接受用户的一些输入
$json = json_encode($_POST);
并将其放入查询中
$save = mysqli_query($con, "INSERT INTO table (json) VALUES ('$json')");
这是否易于 SQL 注入?这个输入是否需要转义?在我的测试中,我无法 运行 任何带有
输入的查询
') SELECT * FROM table; --
但我一点都不擅长这个。
PS - 这是学习测试。我实际上并没有在项目中这样做。
郑重声明,是的,它很容易受到攻击。 json_encode()
不转义除 "
.
以外的特殊字符
这是一个演示:
<?php
$a = [ "name" => "O'Reilly" ];
$j = json_encode($a);
echo "$j\n";
输出:
{"name":"O'Reilly"}
现在,如果将其插入到 SQL 字符串中会发生什么?
你会在单引号 SQL 字符串文字中得到一个未转义的单引号字符,这会导致语法错误。
INSERT INTO table (json) VALUES ('{"name":"O'Reilly"}')
^
上面评论中的建议是正确的:如有疑问,请使用查询参数。那就不用担心字符串是否安全了
如果我在 $_POST
和 json_encode 中接受用户的一些输入
$json = json_encode($_POST);
并将其放入查询中
$save = mysqli_query($con, "INSERT INTO table (json) VALUES ('$json')");
这是否易于 SQL 注入?这个输入是否需要转义?在我的测试中,我无法 运行 任何带有
输入的查询') SELECT * FROM table; --
但我一点都不擅长这个。
PS - 这是学习测试。我实际上并没有在项目中这样做。
郑重声明,是的,它很容易受到攻击。 json_encode()
不转义除 "
.
这是一个演示:
<?php
$a = [ "name" => "O'Reilly" ];
$j = json_encode($a);
echo "$j\n";
输出:
{"name":"O'Reilly"}
现在,如果将其插入到 SQL 字符串中会发生什么?
你会在单引号 SQL 字符串文字中得到一个未转义的单引号字符,这会导致语法错误。
INSERT INTO table (json) VALUES ('{"name":"O'Reilly"}')
^
上面评论中的建议是正确的:如有疑问,请使用查询参数。那就不用担心字符串是否安全了