【问题标题】:How to store user content while avoiding XSS vulnerabilities如何在避免 XSS 漏洞的同时存储用户内容
【发布时间】:2021-03-14 15:12:37
【问题描述】:

我知道有人问过类似的问题,但我正在努力弄清楚如何去做。

我正在构建一个 CMS,现在相当原始,但它是一种学习练习;在生产站点中,我肯定会使用现有的解决方案。

我想接受用户输入,可以在 WYSIWYG 编辑器中设置样式。我还希望他们能够内联插入图像。

我知道我可以将 HTML 存储在数据库中,但是如何安全地重新渲染它。我知道存储的 HTML 没有问题,但我的理解是,如果我只是简单地将用户生成的代码转储到布局模板上,XSS 就会成为问题。

所以问题很简单,就是如何在 cms 中存储和安全地重新呈现用户内容?我正在使用 Laravel 和 PHP。如果需要的话,我对 javascript 也有一点了解。

【问题讨论】:

  • 您需要添加更多详细信息以便回答。市场上有多种 CMS 的音调 + 数以百万计的自定义构建,您甚至没有提及您使用的内容。这个问题绝对是基于意见的,因为它不符合 Stackoverflow 的要求,它将被关闭。
  • @biesior 尊重,我不同意这个问题缺乏足够的细节。这个提问者不是在问 TinyMCE 是否是一个好的选择,而是在问如何清理传入的输入以防御网络爬虫。这个问题有具体的答案。
  • @O.Jones 很好,您正在尝试提供帮助,但是 OP 甚至没有询问 TinyMCE,而只是一般而言所见即所得。这是一个非常广泛的问题,很可能会产生很多基于意见的答案。好的行为是写关于代码的某些实际部分的问题,回答“如何将用户内容存储到 CMS”我们可以写整本书......最后我建议熟悉how to ask a question
  • @biesior 我没有询问任何特定的 CMS 或构建,因为我没有使用。正如我在上面的问题中提到的,我正在寻求构建一个 CMS。因此,我不明白你评论的前提是什么? O. Jones 说我在质疑如何防范攻击是对的。我觉得你可能误解了我的问题?很高兴澄清它是否有帮助,并且您能够提供有用的答案/建议来帮助我?

标签: php mysql sql content-management-system xss


【解决方案1】:

对于您希望允许某些标签但不允许其他标签的 CMS,您需要类似HTML Purifier 的内容。这将获取 HTML 并针对白名单运行它并重新生成可安全显示给用户的 HTML。

【讨论】:

    【解决方案2】:

    避免跨站点脚本的一种既好又便宜的方法是让您的 php 程序在将用户输入的所有内容存储到数据库之前将其实体化。也就是说,您想从用户那里获取此条目

    Hi there sucker! I just hacked your site.
    <script>alert('You have been pwned!')</script>
    

    并在将其放入数据库之前将其转换为这个。

    Hi there sucker! I just hacked your site.
    &lt;script&gt;alert('You have been pwned!')&lt;/script&gt;
    

    当您将&amp;lt; 传递给浏览器时,它会将其呈现为&lt;,但它不会对它做任何其他事情。

    htmlentities() 函数可以为您执行此操作。而且,如果需要,php 的htmlspecialchars_decode() 可以反转它。但是,除非您绝对必须这样做,否则不应撤消操作,例如将文档加载到嵌入式编辑器中进行更改。

    您还可以选择在从数据库中检索到用户提供的文本之后并在显示之前将其实体化。如果你的代码需要几个人一起工作,为了安全起见,你可能希望两者都做。

    您还可以在&lt;pre&gt;content&lt;/pre&gt; 标签内呈现用户提供的输入,这告诉浏览器只呈现文本而不用做任何其他事情。

    (在此页面上使用右键单击 Inspect 查看 Stack Overflow 如何处理我的恶意示例。)

    【讨论】:

    • 感谢您的回答@O。琼斯。感谢您强调我可以在此页面上查看库存溢出是如何做到的这一事实。然后我可以把它变成一个 HTML 标签,例如。 通过使用正则表达式查找 htmlentity 并再次将其替换为标记?
    • 看这个。 php.net/manual/en/function.htmlspecialchars-decode.php 当您可以使用完全调试的语言功能时,请避免使用正则表达式...许多 XSS 漏洞来自未完全调试的清理功能,例如正则表达式。
    • 抱歉,我确定我只是遗漏了一些东西。如果我使用您在上面链接的功能,这是否不会将所有内容更改回 HTML 元素,因此仍会注入恶意代码?在以另一种方式处理
    • 您询问如何将实体化数据转回标签。我不确定您为什么要这样做,但我建议您避免使用正则表达式并使用内置语言函数。
    • 谢谢,@O。琼斯感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多