我最近接手了一个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
答案 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(); ?>
正如其他人所说,最可能出现的情况似乎是魔术引号已经打开。