使用filter_var进行防御

时间:2015-07-21 16:50:37

标签: php validation url input filter-var

我开始学习网络开发并找到了这个:

filter_var('php://', FILTER_VALIDATE_URL);

但他们说:

  

上面的缺陷是过滤器选项没有限制允许的URI方案的方法,用户希望这是http,https或mailto之一,而不是某些通用的PHP特定URI。这是我们应该不惜一切代价避免的通用验证方法。

来源Input Validation

我的问题:

  • 我仍然不明白为什么要避免?
  • 任何人都可以举出我可以模拟的攻击示例吗?

注意:这是我在这里发表的第一篇文章,如果它有很多或有问题,我很抱歉。

谢谢。

2 个答案:

答案 0 :(得分:1)

var_dump(filter_var('testing://123.com', FILTER_VALIDATE_URL));  

不是假的。这是你的答案:)你不想对一个不在注册计划中的网址说好。

因此,评论本质上意味着即使filter_var将扫描正确的URL格式,它也无法正确判断URL方案是否良好,并且许多不良网址仍然可以通过因为这是通用的。这就像说一个美国电话号码是10位数,如果那是唯一的支票那么可以,那么1111111111也是一个有效的电话号码?

但这并不意味着这是无用的,你总是可以为你的if条件添加更多一点来迎合这一点,这样评论绝不是世界末日。您可以通过

之类的内容来改进检查
  if(filter_var($url, FILTER_VALIDATE_URL) && parse_url($url, PHP_URL_SCHEME)=="http")

答案 1 :(得分:0)

这个例子怎么样

filter_var('javascript://test%0Aalert(321)', FILTER_VALIDATE_URL) !== false; //true