【问题标题】:prevent javascript execution over file_get_contents防止通过 file_get_contents 执行 javascript
【发布时间】:2017-09-04 23:14:19
【问题描述】:

有没有办法配置 PHP/服务器(通过 Nginx php-fpm)以防止 php file_get_contents 执行 javascript?

现在,如果我允许用​​户上传嵌入了 js 的 html 文件,当文件通过 file_get_contents() 调用显示时,JS 会被执行。

我计划添加 HTML 过滤(即拒绝 html 上传),但如果我可以在输出上设置第二层安全性,而不是仅在上传上(以防第一层无法进入),那就更好了帐户这样的场景)。

谢谢

【问题讨论】:

  • 你想做什么而不是执行 JS?默认情况下,浏览器只会将其视为可执行文件 - 你想完全删除它吗?或者只是将整个上传显示为转义的 HTML?
  • 如果您根本不想允许 html,您可以使用 preg_replace("%</?[^>]+>%s", "", $file) 去除所有 html 标签
  • 事实上,我想做的是处理文件类型黑名单(因为在这种情况下没有白名单),但仍然添加额外的安全措施。我想在这种情况下最好的方法是 1)添加一些 xss 检查以最小化潜在的攻击向量 2)强制通过

标签: javascript php security nginx


【解决方案1】:

感谢 jcubic 提供了一个链接来解释为什么他的解决方案不起作用;)

我知道只有 2 个可靠的解决方案:

1) 使用 HTML 以外的标记语言,该语言具有可证明的语法并且不允许嵌入脚本(BBCode?)。这个still requires that you validate the submission 用于合规性 - 但比 HTML 更简单。

2) 应用不允许内联 javascript 的 content security policy - 这将是我的首选解决方案,尤其是因为您可以指定报告 URL,从而允许您监控浏览器上发生的事情,而不是依赖于过滤服务器。

【讨论】:

  • 感谢 symcbean。最后,我会选择 1) 如果文件作为一些不应该存在的脚本标签,则进行预 xss 过滤以向最终用户显示消息 2) 强制下载内容 3) 将 CSP 添加到“default- src '无';"; (3) 是我所缺少的,这是完美的解决方案,因为我有一个特定的子域来下载内容。
【解决方案2】:

您可以在回显文件内容之前尝试剥离 JavaScript:

echo preg_replace("%<script[^>]*>.*</script>%si", "", file_get_contents());

或者您可以在上传文件时调用它,这样您就不必每次都这样做了。

您可能还想删除带有javascript: 协议的 url 的 onclick 和 style 等事件,以删除那些您可能更适合使用 xml 解析器的事件。

以下是您可以考虑的 XSS 向量攻击列表:XSS Filter Evasion Cheat Sheet

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多