可能重复:
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没有空格,特殊字符等。
只是想知道这是否可以利用?
答案 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']));
}