我正在尝试组合一些PHP验证函数来筛选用户提交的表单数据,以查找可能存在安全风险的任何字符或字符串。我已经采取了我所知道的步骤,下面列出了这些步骤,但我希望确保我不会忽略任何东西!
用户提供的数据按如下方式过滤:
使用预准备语句将所有数据插入/更新到MySql。所有非数字用户提交的数据都使用htmlentities($ val,ENT_QUOTES,'UTF-8')输出到浏览器
截至目前,用户提交的文本可以包括姓名,地址,电子邮件,网址,电话号码,rgba值 - 还包括可能包含html格式的段落,例如< div class =“paragraphtext”style =“width:10rem”>< H1>页眉和LT; / h1>一些段落文本....可以包括:标点符号(偶数括号)?!< / DIV>
在我看来,我缺少的是过滤用户提交的常规文本以查找任何不安全的字符或字符串...但我不确定它们会是什么。是否使用了准备好的陈述/ htmlentities - 或者我还应该做些什么呢?此外 - 我目前的任何过滤器都不正确吗?
UPDATE ::
现在我决定将filter_var()和FILTER_VALIDATE_REGEXP用于尚未使用上述过滤器处理过的所有其他文本。正则表达式允许我可以合理地想到在段落中使用的任何标点符号。据我所知,使用准备好的语句和htmlentities可以缓解我对引号,斜线等字符的任何问题 - 所以我希望这很好吗?任何反馈都会很棒。对于任何发现这一点的人来说,我也使用preg_replace来吐出违反正则表达式的字符列表 - 这样我就可以让用户知道哪些字符无效。我也使用它的一些数组函数来过滤掉重复的字符。代码是:
$rgx='[a-zA-Z0-9!#%&:;=@~"\'\/\\\^\*\-\_\.\?\+\(\)\$\s]';
if(!filter_var($val,FILTER_VALIDATE_REGEXP,array('options'=>array('regexp'=>'/^'.$rgx.'+$/'))))
{
return'Error! May not contain '.implode(' ',array_unique(str_split(preg_replace('/'.$rgx.'/','',$val))));
}
答案 0 :(得分:0)
没有"通用过滤/验证方法"为了你想要的。您始终必须验证并转义使用数据的特定上下文中的数据。
重要说明:请勿使用过滤,请使用显式验证和白名单。
<强>示例:强>
htmlentites()
(针对XSS攻击)。escapeshellcmd()
和escapeshellarg()
等。