我问这个问题因为我还不太确定filter $ _GET变量是否足以阻止mysql注入,所以起初我有一个过滤函数
function filter_url($url)
{
if (is_array($url))
{
foreach ($url as $key => $value)
{
// recurssion
$url[$key] = filter_url($value);
}
return $url;
}
else
{
// remove everything except for a-ZA-Z0-9_.-&=
$url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
return $url;
}
}
我打电话之前每次都有$_GET=filter_url($_GET);
$filter_case =isset($_GET['product_ID'])?"and product_ID={$_GET['product_ID']}":"";
我需要$mysqli->real_escape_string($_GET['product_ID'])
吗?如果我仍然需要暗示它,什么样的SQL注入将超越我的查询方法?
此外,重要的是做$mysqli->real_escape_string($_SESSION['member_ID'])
我正在考虑是否有人可以操纵他的$_SESSION
变量?
答案 0 :(得分:0)
这个问题本质上是错误的。
在SQL查询中添加字符串文字时需要$mysqli->real_escape_string
。在这种情况下,您需要此函数,无论字符串来源或验证如何。 In任何其他情况(即字符串不在查询中或不作为SQL字符串)这个函数绝对没用。
这就是使用预备语句(本机或模拟)的必要原因。