-1

以下代码取自一个教程:

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

4

5 回答 5

1

用字符引用的 PHP 字符串"插入变量并将'字符视为文字。

$name_bar是一个包含'字符的字符串。

当它被插值时,其中的所有字符都放在变量所在的位置。

于 2013-07-29T08:41:05.333 回答
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";
于 2013-07-29T08:43:21.663 回答
1

因为你基本上只是在连接字符串。

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

是相同的

$query_bad = "SELECT * FROM customers WHERE username = '' OR 1''";

因为$name_bad' OR 1'

于 2013-07-29T08:43:40.693 回答
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

于 2013-07-29T08:44:24.260 回答
1

请参阅此图像中的说明:

在此处输入图像描述

于 2013-07-29T08:47:28.277 回答