PHP - 自动SQL注入保护?

时间:2010-04-26 17:17:04

标签: php sql sql-injection

我最近接手了一个PHP应用程序的维护,我对PHP并不是很熟悉,但我在网站上看到的一些东西让我感到紧张,因为它可能容易受到SQL注入攻击。< / p>

例如,查看登录管理部分的代码如何工作:

    $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

4 个答案:

答案 0 :(得分:2)

我的猜测是,magic quotes阻止了您通过该应用程序的尝试。

然而,依靠这样做是非常糟糕的做法,而且该应用程序确实应该拥有更多自己的验证和逃避。

答案 1 :(得分:0)

你在这个问题上可以做的就是你必须对数据进行良好的验证,并且对于每个非安全字符,你必须在它之前添加反斜杠:\'并阻止获取/ *(这是mysql注释使用sql注入注释后注释下一个sql语句。

答案 2 :(得分:0)

如果您在服务器上回显$ _POST ['loginEmail']并尝试攻击,您很可能会看到magic_quotes已打开。

如果它打开,它将看起来像\'或\'x \'= \'x

您应该在所有SQL查询中使用PDO类(http://www.php.net/manual/en/pdo.prepare.php)。

答案 3 :(得分:0)

您在评论中提到,您试图确定是否启用了魔术引号:

<?php get_magic_quotes_gpc(); ?>

您可能打算这样做:

<?php echo get_magic_quotes_gpc(); ?>

正如其他人所说,最可能出现的情况似乎是魔术引号已经打开。