以下代码摘自一个教程:
<?php
// user input that uses SQL Injection
$name_bad = "' OR 1'";
// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
// display what the new query will look like, with injection
echo "Injection: " . $query_bad;
在前端,它显示:
Injection: SELECT * FROM customers WHERE username = '' OR 1''
问题:
为什么显示username = '' OR 1''
?
答案 0 :(得分:1)
引用"
个字符的PHP字符串插入变量并将'
个字符视为文字。
$name_bar
是一个包含'
个字符的字符串。
插值时,其中的所有字符都放在变量所在的位置。
答案 1 :(得分:1)
在PHP中,如果在双引号中你编写任何变量,它将被变量的值替换为PHP在你的情况下完美地完成
// user input that uses SQL Injection
$name_bad = "' OR 1'";
// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
如果我将值$ name_bad替换为'OR 1',那么它将变为
SELECT * FROM customers WHERE username = '' OR 1'';
如果您想在查询之前和之后删除额外的',那么您已将查询编写为:
// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = $name_bad";
答案 2 :(得分:1)
因为你基本上只是在连接字符串。
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
与
相同$query_bad = "SELECT * FROM customers WHERE username = '' OR 1''";
因为$name_bad
是' OR 1'
。
答案 3 :(得分:1)
这样做是因为$name_bad
包含单引号,并且您已将其插入另一个字符串中的另一组引号之间。
为了获得最佳实践,请使用:
$string = sprintf('SELECT * FROM customers WHERE username = \'%s\'', ' OR 1');
然而,在SQL上,需要对其进行清理。
如果您使用PDO,bindParam
方法将自动阻止SQL注入(它声明)。
答案 4 :(得分:1)
请参阅此图片中的说明: