防守 filter_var

Defense with filter_var

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

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

但他们是这样说的:

The flaw in the above is that the filter options have no method of limiting the URI scheme allowed and users’ expect this to be one of http, https or mailto rather than some generic PHP specific URI. This is the sort of generic validation approach we should seek to avoid at all costs.

来源 : Input Validation

我的问题:

注意:这是我第一次 post 在这里,如果有很多或模糊的问题,我很抱歉。

谢谢。

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

不假。这就是你的答案 :) 你不想对不在注册方案中的 url 说好。

所以那个注释本质上是说即使filter_var会扫描一个合适的URL格式,它也不能正确判断URL方案好不好, 很多坏的 urls 仍然可以通过,因为这是通用的。这就像说美国 phone 号码是 10 位数字,是的,如果这是唯一的检查,那么 1111111111 也是一个有效的 phone 号码吗?

但这并不意味着这是无用的,您可以随时在 if 条件中添加更多内容来满足这一点,这样评论无论如何都不是世界末日。您可以通过

之类的方式改进该检查
  if(filter_var($url, FILTER_VALIDATE_URL) && parse_url($url, PHP_URL_SCHEME)=="http")

举个例子怎么样

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