PHP -- 自动防止SQL注入?

3

最近我接手了一个PHP应用的维护工作,但我对PHP并不是很熟悉,网站上出现的一些情况让我担心它可能容易受到SQL注入攻击。

例如,看一下这个用于登录管理部分的代码:

    $password = md5(HASH_SALT . $_POST['loginPass']);
    $query = "SELECT * FROM `administrators` WHERE `active`='1' AND `email`='{$_POST['loginEmail']}' AND `password`='{$password}'";
    $userInfo = db_fetch_array(db_query($query));

    if($userInfo['id']) {
        $_SESSION['adminLoggedIn']  = true;
        // user is logged in, other junk happens here, not important

该网站的创建者制作了特殊的db_query方法和db_fetch_array方法,如下所示:

function db_query($qstring,$print=0)        { return @mysql(DB_NAME,$qstring); }
function db_fetch_array($qhandle)       { return @mysql_fetch_array($qhandle); }

现在,这让我想到我应该能够使用类似于电子邮件地址的方式进行某种SQL注入攻击:
' OR 'x'='x' LIMIT 1;

还有一些随机密码。当我在命令行上使用它时,我会得到一个管理员用户,但是当我在应用程序中尝试时,我会得到一个无效的用户名/密码错误,就像我应该的那样。

可能有一些全局的PHP配置,他们已经启用以阻止这些攻击吗?那在哪里配置?

以下是PHP --version信息:

# php --version
PHP 5.2.12 (cli) (built: Feb 28 2010 15:59:21) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with the ionCube PHP Loader v3.3.14, Copyright (c) 2002-2010, by ionCube Ltd., and
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies

哦,我的天,这是什么问题。从来没有想过我会讨厌回答 :) - Your Common Sense
你尝试过注入了吗? - Ben
如果您最终关闭了magic_quotes_gpc并进行适当的转义,请非常仔细地查看与文件系统一起使用的任何用户输入。魔术引号并不是为了在这里保护您,但许多业余脚本无意中依赖于它的副作用。未经转义的空字节在php的文件系统函数中非常糟糕... - goat
Ben -- 是的,我尝试了注入但是无法使其工作。也许我只是不擅长注入,但看起来应该可以工作。Chris -- 我在整个代码库中搜索了magic_quotes,但没有找到任何东西。这是托管服务器(是的...我很快就会将其移动到EC2)上托管的,所以可能是环境范围内的配置。有什么方法可以检查吗?主机公司给我的查看PHP配置的链接已经失效了。 - ashgromnies
4个回答

2
我的猜测是,你在应用程序中的尝试被“魔术引号”所阻挠。但是,依赖这种功能是极其不好的做法,该应用程序应该有更多自己的验证和转义处理。请参考magic quotes了解详情。

我在整个代码库中使用grep命令搜索了magic_quotes,但没有找到任何相关内容。这个网站是托管在一个托管服务器上的(是的...我很快会将其迁移到EC2),所以可能是环境范围内的配置问题。有没有办法进行检查?主机公司给我的查看PHP配置的链接已经失效了。 - ashgromnies
我尝试在页面上打印 <?php get_magic_quotes_gpc(); ?> ,但什么也没有打印出来,所以我认为它可能被禁用了。 - ashgromnies
@ash get_magic_quotes_gpc() 不会输出任何内容。在函数调用前添加一个 echo - Pekka

0

你在评论中提到尝试使用以下代码确定魔术引号是否启用:

<?php get_magic_quotes_gpc(); ?>

你可能是想要这样做:

<?php echo get_magic_quotes_gpc(); ?>

最有可能的情况似乎是,正如其他人所说,魔术引号被开启了。


0
在这个问题中,你所能做的就是必须对数据进行良好的验证,并且对于每一个非安全字符如 ' ,你必须在它前面添加反斜杠,例如:\',并且阻止获取 /*(这是用于在 SQL 注入后注释下一个 SQL 语句的 MySQL 注释)。

0
如果您在服务器上回显 $_POST['loginEmail'] 并尝试攻击,很可能会发现 magic_quotes 已经开启。
如果它已经开启,它将看起来像 \' OR \'x\' = \'x\'
您应该在所有 SQL 查询中使用 PDO 类(http://www.php.net/manual/en/pdo.prepare.php)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接