php:单引号和双引号如何协同工作

时间:2013-07-29 08:38:08

标签: php mysql

以下代码摘自一个教程:

 <?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''

5 个答案:

答案 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注入(它声明)。

http://www.php.net/manual/en/pdo.prepared-statements.php

答案 4 :(得分:1)

请参阅此图片中的说明:

enter image description here