2012-08-22 76 views
2

这是功能我有检查,如果输入的安全问题和/或答案包含恶意字符:“怎么了”的preg_match包括正斜杠

function validate_input($field) { 
    $ErrorMessage = ""; 
    $field = preg_replace("/[\s]+is/", '', $field); 
    if(preg_match("/^[A-Za-z0-9'?!-\s]+$/", $field) ===0) { 
     $ErrorMessage .= "<div class='error_message'>Potentially malicious characters found in:<i> " . $field . ",</i> please enter only alphanumeric characters</div/><br/>"; 
    } return $ErrorMessage; 
} 

当我输入类似对于这个问题,它返回一个错误。当我在($ field)上做一个var_dump时,它会回到“What's up?”。

那么我怎样才能将正斜杠作为可接受的字符?

+0

您是否正在检查“恶意字符”以防止SQL注入? – Matt

+0

是的,这是主意 – nv39

+1

你应该停止使用'mysql_ *'函数。他们正在被弃用。请使用[PDO](http://php.net/manual/en/book.pdo.php)(自PHP 5.1起支持)或[mysqli](http://php.net/manual/en/book)。 mysqli.php)(自PHP 4.1起支持)。如果你不确定使用哪一个,[阅读本文](http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/)。当你在两者中使用准备好的语句时,他们将有助于防止sql注入,从而使上面的代码变得不必要。 – Matt

回答

2

看起来你有PHP活动的“魔术引用”功能,这不应该是出于安全原因:所有用户插入数据的转义应该由您自己的代码完成。

无论如何,如果你想保持的东西,因为他们现在的样子,更换您的

preg_match("/^[A-Za-z0-9'?!-\s]+$/", $field) 

preg_match("/^[A-Za-z0-9'?!-\s\\\\]+$/", $field) 

四倍\是存在的,因为你需要逃避它两者在被用双引号分隔的字符串和正则表达式。

+0

谢谢,我会在几分钟内接受答案 – nv39

0

允许正斜杠和其他正常字符的示例。

$string = "J’s Bikes/IHOP"; // bad user input 
    if (!preg_match("/^[[email protected]#$%&()*;:_.'\/\\\\ ]+$/", $string)) { 
     echo "Invalid $string";   
     }