preg_match用于防止PHP表单中的注入


preg_match for preventing injection in PHP form

我是PHP的绝对初学者,试图设置一个验证来阻止联系人表单上的标头注入。我读了很多教程,并制作了一个应该验证的表单,但它不起作用……在这里研究了一点之后,似乎我的问题是我使用的代码是eregi(旧教程),这些天应该是preg_match。我已经使用preg_match来验证电子邮件地址格式,但我想确保没有断行,抄送,密件抄送等可以潜入任何地方。这是我现在的函数:

    function spamcheck($field) {
if(eregi("to:",$field) || eregi("cc:",$field) || eregi("Content-Type:",$field) || eregi("bcc:",$field) || eregi("%0D",$field) || eregi("'r",$field) || eregi("'n",$field) || eregi("%0A",$field)){ 
    $possiblespam = TRUE;
}else $possiblespam = FALSE;
if ($possiblespam) {
    die("Possible spam attempt detected. If this is not the case, please edit the content of the contact form and try again.");
    return 1;
}

}

现在,我不确定我是否可以像这样用preg_match替换eregi:

     if(preg_match("/to:/i",$field) 
     // and so on for each string I want to catch

我在这里读到preg_match需要分隔符,不确定我是否正确使用它们。此外,应该区分大小写,所以我添加了I标志(没有置信度)。尽管如此,我还是不知道上面所说的是否正确。这看起来安全吗?再次为我缺乏PHP知识而道歉。这种函数在在线教程中很常见,但使用的是eregi而不是preg_match.

仅仅检查换行符就足够了:

$possiblespam = (0 !== preg_match("~('r|'n)~", $field));