单引号是否在PHP中自动转义?那么清洁需要什么?

时间:2011-06-15 13:18:27

标签: php sql escaping quotes code-injection

我正在阅读网络安全性,一个明显的主题是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相同。

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

干杯

埃里克

2 个答案:

答案 0 :(得分:8)

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/en/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/

答案 1 :(得分:6)

在php.ini中禁用magic_quote并使用PDO