2010-04-26 98 views
3

我最近接管了一个PHP应用程序的维护,并且我对PHP不是很熟悉,但是我在网站上看到的一些事情让我感到紧张,因为它可能容易受到SQL注入攻击。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 - 版本信息:

# 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 
+0

哦,我的问题。从来没有想过我讨厌回答:) – 2010-04-26 17:19:58

+0

你试过注射吗? – Ben 2010-04-26 17:22:11

+0

如果您最终关闭magic_quotes_gpc并进行正确转义,请仔细查看通过文件系统连接使用的任何用户输入。魔术引号的目的不是为了保护你,但这是许多业余剧本在不知不觉中依赖的副作用。未转义的空字节与php的文件系统功能真的很不好... – goat 2010-04-26 19:38:23

回答

2

我的猜测是,通过应用程序的尝试被挫败magic quotes

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

+0

我对整个代码库grepped magic_quotes并没有看到任何东西。这是托管在一个托管服务器(是的...我很快将它移动到EC2),所以也许这是一个环境的配置。有没有办法检查?托管公司给我查看我的PHP配置的链接被破坏。 – ashgromnies 2010-04-28 12:53:59

+0

我试过打印<?php get_magic_quotes_gpc(); ?>在一个页面上,它什么都不打印,所以我认为它可能被禁用。 – ashgromnies 2010-04-28 13:00:58

+0

@ash'get_magic_quotes_gpc()'不输出任何内容。在函数调用前添加一个'echo'。 – 2010-05-03 09:16:27

0

你可以在这个问题中做的所有事情是,你必须有一个很好的数据验证,并且对于每个非安全字符'你必须在它之前加上反斜杠',并且阻止获得/ *(this使用MySQL的评论在SQL注入征求意见的下一个SQL statments注射后。

0

如果你回声出$ _ POST [“表示loginEmail”]您的服务器上,并尝试你很可能会看到magic_quotes的是打开了攻击。

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

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

0

你在你试图确定一个评论,如果魔术引号是启用提到:

<?php get_magic_quotes_gpc(); ?> 

你可能打算这样做,而不是:

<?php echo get_magic_quotes_gpc(); ?> 

最有可能的情况似乎确实像其他人所说的那样,魔术引号被打开。