哪些文本需要从用户提交的数据中过滤?

时间:2016-04-13 02:00:42

标签: php mysql forms input filter

我正在尝试组合一些PHP验证函数来筛选用户提交的表单数据,以查找可能存在安全风险的任何字符或字符串。我已经采取了我所知道的步骤,下面列出了这些步骤,但我希望确保我不会忽略任何东西!

用户提供的数据按如下方式过滤:

  • 对于整数,我检查ctype_digit()是真还是假
  • 对于其他可能包含小数的数字,我使用is_numeric()
  • 对于电子邮件,我使用filter_var()和FILTER_VALIDATE_EMAIL
  • 对于IP地址,我使用filter_var()和FILTER_VALIDATE_IP
  • 对于网址,我使用filter_var()和FILTER_VALIDATE_URL
  • 对于HTML代码我使用strip_tags()同时允许:p,a,b,br,font,h1,h2,h3,h4,h5,h6,i,li,ol,span,ul,strong,div, img,文章,部分,标题,页脚,放在一边,详细信息,figcaption,图,主要,马克,导航,摘要,时间,前,小时,风格,路径
  • 对于RGBA,我使用带有FILTER_VALIDATE_REGEXP的filter_var()和以下正则表达式:'/ ^(([0-9] | [1-9] [0-9] | 1 [0-9] [0-9 ] | 2 [0-4] [0-9] | 25 [0-5])){3}(0([0-9] +)|。?1(0.0 +))$ /”
  • 为验证时间戳,我检查它是否为整数 - 如果是,则将其传递给日期()。如果它不是整数,我会看到DateTime :: createFromFormat()是否可以解释它

使用预准备语句将所有数据插入/更新到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))));

}

1 个答案:

答案 0 :(得分:0)

没有"通用过滤/验证方法"为了你想要的。您始终必须验证并转义使用数据的特定上下文中的数据。

重要说明:请勿使用过滤,请使用显式验证和白名单。

<强>示例:

  • 您将数据输入数据库,使用(正如您已经做过)准备好的语句(这是最好的......好吧,或至少逃避它们)。
  • 您再次将用户输入输出为HTML输出,使用htmlentites()(针对XSS攻击)。
  • 您调用shell命令(例如,用于压缩图像或处理特定的csv文件),然后使用escapeshellcmd()escapeshellarg()等。
  • 如果您想验证电子邮件地址是否正确,请不要编写自己的正则表达式,而是使用现有的验证类。 等