这是一种过滤数据并防止SQL注入和其他攻击的安全方法吗?

时间:2011-12-07 09:57:44

标签: php sql function code-injection

我创建了两个简单的函数来在插入的数据输入mysql查询之前对其进行过滤。

对于formfields(我也使用正则表达式来单独检查每个字段。

// Form filter
function filter($var) 
{               

    // HTML is not allowed
    $var = strip_tags(trim($var)); 

    // Check magic quotes and stripslashes
    if(get_magic_quotes_gpc())
    { 
        $var = stripslashes($var);
}

    // Not using it right now, is it recommended?
    // $var = htmlentities($var, ENT_QUOTES);

    // Escape
    $var = mysql_real_escape_string($var);

    // Return    
    return $var; 
}

然后对于id(在URL中发送)我正在使用此过滤器:

// ID filter
function idfilter($idfilter)
{
// Delete everything except numbers
$idfilter = ereg_replace("[^0-9]", "", $idfilter);

// Round numbers
$idfilter = round($idfilter);

// Test if the input is indeed a number
if(!is_numeric($idfilter) || $idfilter % 1 != 0)
{
    $idfilter = 0;
}

// Filter using the formfilter (above)
return filter($idfilter);
} 

是否有建议添加或剥离这些简单的功能?它是“安全的”吗?

3 个答案:

答案 0 :(得分:3)

您使用已弃用的函数magic_quotesereg_*。为了防止Sql注入,你应该使用准备好的声明(我建议使用PDO)并且为了防止XSS,你应该像你一样使用strip_tags()

答案 1 :(得分:2)

在查询中使用参数而不是连接字符串。

过滤器和清洁剂通常不够安全。

答案 2 :(得分:1)

如果您使用整数ID idFilter()可以安全地剥离到

function idfilter($idfilter) {
  return (int)$idfilter;
} 

正如其他人所建议的那样,使用参数化查询是正确的方法。