PHP URL与域名验证过滤器失效问题及原因分析
PHP过滤器异常原因分析
问题1:FILTER_VALIDATE_URL未识别无效URL的原因
- 你参考的自定义URL校验正则规则和PHP内置
FILTER_VALIDATE_URL的校验逻辑并不一致。PHP的URL过滤器遵循RFC 2396规范,默认允许URL的查询参数、片段部分包含(等子分隔符,你测试用的URL末尾的(属于片段部分允许的字符,因此会被判定为合法。 FILTER_VALIDATE_URL默认没有启用严格校验规则,如果需要更严格的校验,可搭配对应的flags参数,比如FILTER_FLAG_PATH_REQUIRED、FILTER_FLAG_QUERY_REQUIRED等实现自定义校验逻辑。
问题2:域名验证过滤器不生效的原因
- 核心是代码逻辑错误:你解析出域名
$domain后,调用filter_input(INPUT_POST,'url',FILTER_VALIDATE_DOMAIN)校验的是用户提交的完整输入字符串,而非解析出来的域名变量,相当于完全没有对提取到的域名做校验,自然不会触发你预期的无效提示。你出现的「Valid Domain: LINE: 27」输出,是因为输入内容没有带http/https前缀时,parse_url无法提取到host值,$domain为空,因此输出时域名位置空白。 - 即便你修正为用
filter_var($domain, FILTER_VALIDATE_DOMAIN)校验,默认规则下末尾带点的域名也是合法的:这种写法是DNS体系中的绝对域名表示方式,指向根域。如果要禁止末尾带点的域名,需要额外添加FILTER_FLAG_HOSTNAME标志,才会遵循主机名的命名规则做校验。
内容的提问来源于stack exchange,提问作者Nut Cracking Dude
相关产品推荐
相关产品推荐

