【问题标题】:Defense with filter_var使用 filter_var 进行防御
【发布时间】:2015-10-11 06:16:18
【问题描述】:

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

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

但他们是这样说的:

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

来源Input Validation

我的问题:

  • 我还是不明白为什么要避免?
  • 谁能给出我可以模拟的攻击示例?

注意:这是我在这里的第一篇文章,如果有很多或模糊的问题,请见谅。

谢谢。

【问题讨论】:

    标签: php validation url input filter-var


    【解决方案1】:
    var_dump(filter_var('testing://123.com', FILTER_VALIDATE_URL));  
    

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

    所以该评论本质上意味着即使filter_var 会扫描正确的 URL 格式,它也无法正确判断 URL Scheme 的好坏,并且很多坏的 url 仍然可以通过,因为这是通用的。就像说美国电话号码是 10 位数字一样,是的,如果这是唯一的检查,那么 1111111111 也是有效的电话号码?

    但这并不意味着这没有用,您可以随时在 if 条件中添加更多内容来满足这一点,这样评论就不会成为世界末日。您可以通过类似的方式改进检查

      if(filter_var($url, FILTER_VALIDATE_URL) && parse_url($url, PHP_URL_SCHEME)=="http")
    

    【讨论】:

    • 谢谢@Hanky,现在我知道函数 filter_var() 可能会失败,文档中的给定示例使用了 php:// ,因为我是一个新学习者,这让我很困惑,哈哈!我会尝试放置恶意数据而不是 URL,看看我是否可以让它工作。谢谢
    【解决方案2】:

    这个例子怎么样

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

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2018-07-29
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多