[英]php: how does single quote and double quote work together
以下代码摘自一个教程:
<?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''
?
用"
字符引号的PHP字符串对变量进行插值,并将'
字符视为文字。
$name_bar
是包含'
字符的字符串。
插值后,其中的所有字符都将放置在变量所在的位置。
在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";
因为您基本上只是在容纳字符串。
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
是相同的
$query_bad = "SELECT * FROM customers WHERE username = '' OR 1''";
因为$name_bad
是' OR 1'
。
这样做是因为$name_bad
包含单引号,并且您已将其插入到另一个字符串的另一组引号之间。
对于最佳做法,使用:
$string = sprintf('SELECT * FROM customers WHERE username = \\'%s\\'', ' OR 1');
但是,对于SQL,将需要进行清理。
如果您使用的PDO,该bindParam
方法会自动防止SQL注入(它指出)。
请参阅此图中的说明:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.