-2

可能重复:
mysql_real_escape_string() 和 mysql_escape_string() 是否足以保证应用安全?

所以基本上我在 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 没有空格、特殊字符等。

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

4

3 回答 3

1

这是安全的,因为您正确地转义了该值-除非....

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

但是由于您可能刚刚发布了一个片段并在该语句之前初始化了变量(您这样做了,对吗?!),您的代码是安全的。if考虑使用准备好的语句(使用 PDO)而不是转义 - 它们也使您的代码更具可读性。

于 2012-05-11T14:26:01.600 回答
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 语句中的每个问号。

于 2012-05-11T14:28:26.753 回答
1

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

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

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

}

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

于 2012-05-11T14:31:39.697 回答