这个PHP代码是否可以利用?

时间:2012-05-11 14:23:26

标签: php exploit

  

可能重复:
  Are mysql_real_escape_string() and mysql_escape_string() sufficient for app security?

所以基本上我在URL中有一个qryName

例如:mysite.com/qryName=WHAT

if (isset($_GET['qryName']))
{
    $qryName = mysql_real_escape_string(filter($_GET['qryName']));
}

$urldata = mysql_fetch_assoc(mysql_query("SELECT * FROM gangs WHERE ShortName = '" . $qryName . "' LIMIT 1"));

$ urldata是代码,所以它几乎从数据库中选择。请注意,在数据库中,qryName没有空格,特殊字符等。

只是想知道这是否可以利用?

3 个答案:

答案 0 :(得分:1)

这是安全的,因为你正确地逃避了价值 - 除非......

...您没有初始化变量并且已启用register_globals。在这种情况下,有人可以使用cookie或POST值向您发送包含邪恶SQL语句的$qryName的任意值。

但是,既然您可能刚刚发布了一个剪切并且执行在该if语句之前初始化变量(您这样做,对吗?!),那么您的代码是安全的。考虑使用预准备语句(使用PDO)而不是转义 - 它们也使代码更具可读性。

答案 1 :(得分:1)

您是否考虑使用PDO之类的内容?我的理解是,当使用PDO和绑定变量时,SQL注入是不可能的。还有其他值得考虑的优势。

类似的PDO查询将是:

    $data=array($_GET['qryName']);
    try {
        $STH = $this->DBH->prepare('SELECT * FROM gangs WHERE ShortName = ? LIMIT 1');
        $STH->execute($data);
        while($row = $STH->fetch()) {
                $var1=$row->FieldName;
        }
    }
    catch(PDOException $e) {echo $e->getMessage();}

将变量添加到数组($ data)并将它们绑定到SQL语句中的每个问号。

答案 2 :(得分:1)

为什么不添加一个额外的验证或取出isset并检查它是否只包含字母

if(ctype_alpha($_GET['qryName'])) {

    $qryName = mysql_real_escape_string(filter($_GET['qryName']));

}

http://php.net/manual/en/function.ctype-alpha.php