一尘不染

在PHP中单引号会自动转义吗?那有什么需要清洁的呢?

sql

我正在阅读有关Web安全性的文章,其中一个很明显的主题是SQL注入。我正在尝试建立一个基本的PHP页面,可以在其中执行SQL注入(这是本地服务器)。但是,看来我的代码(或服务器)自动转义了单引号。这是新标准,还是我不知道的服务器上激活的设置?是否需要清除输入内容了?

这是我的服务器端代码的示例:

$foo = $_POST['foo'];
$sql = "SELECT * FROM bar WHERE foo='" . $foo . "'";

connectoTo("database");
query($sql);

connectTo()连接到数据库服务器并选择数据库,而query()是执行查询时常用的过程。从来没有清洗过。但是,当我发送

$_POST['foo'] = "' OR 1=1 #"

PHP页面将其接收为

$_POST['foo'] = "\' OR 1=1 #"

那么foo已经逃脱了吗?$ _GET也是一样。

有什么想法吗?我们是否不再需要清理用户输入?


阅读 178

收藏
2021-03-17

共1个答案

一尘不染

PHP中有一个死掉的“功能”,会自动转出称为Magic
Quotes的
POST /
GET数据。这样做的目的是防止常见的SQL注入类型发生。

实际上,您会得到混乱的数据,并且根据实现的不同,SQL注入还是很有可能的。PHP的开发人员很快意识到了这一点,不赞成使用此功能,因此不鼓励使用它。

在正确的PHP安装中,应绝对禁用此功能!如果您无权设置PHP.ini magic_quotes_gpc off,则可以将其放在代码的顶部:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

摘自:http :
//www.php.net/manual/zh/security.magicquotes.disabling.php

现在,讨论您的SQL注入问题。您会发现,除了引号之外,还有更多的事情需要担心。您无需指定正在使用的数据库,但这无关紧要。避免注入问题的最佳方法是使用准备好的/参数化的查询。

准备的查询是使用参数发送到服务器的查询,其值将在以后发送。

INSERT INTO someTable (field1, field2) VALUES (:field1, :field2);

注意:field1:field2,因为它们是参数。当我执行此语句时,这些将被替换为适当的值。由于服务器正在执行此操作,因此不必进行转义(和/或在后台进行转义,具体取决于您使用的数据库层)。

在PHP中实现此功能的最简单方法是利用PDO。对于此框,如何使用PDO太长了,因此我将指导您使用教程:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-
database-access/

2021-03-17