这段PHP代码可被利用吗?

这段PHP代码可被利用吗?,php,exploit,Php,Exploit,可能重复: 所以基本上我在URL中有一个qryName 例如:mysite.com/qryName=什么 if (isset($_GET['qryName'])) { $qryName = mysql_real_escape_string(filter($_GET['qryName'])); } $urldata = mysql_fetch_assoc(mysql_query("SELECT * FROM gangs WHERE ShortName = '" . $qryName .

可能重复:

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

例如:mysite.com/qryName=什么

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没有空格、特殊字符等


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

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

…您不初始化变量,而是启用了
register\u globals
。在这种情况下,有人可以使用cookie或POST值向您发送包含恶意SQL语句的
$qryName
的任意值


但是,由于您可能只是发布了一个剪贴,并且在
if
语句之前初始化了变量(您是这样做的,对吧?!),所以您的代码是安全的。考虑使用准备好的语句(用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语句中每个问号的顺序进行绑定。

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

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

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

}

学习PDO
mysql.*
函数因安全问题被正式弃用。@itachi请说明在这种情况下,
mysql\u real\u escape\u string()
是如何不安全的