如何在避免XSS漏洞的同时存储用户内容



我知道有人问过类似的问题,但我很难弄清楚怎么做。

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

我想接受用户输入,它可以在所见即所得编辑器中进行样式设置。我还希望他们能够在线插入图像。

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

简单地说,问题是如何在cms中存储并安全地重新发送用户内容?我正在使用Laravel和PHP。如果需要的话,我对javascript也有一些了解。

对于一个想要允许一些标签而不允许其他标签的CMS,那么你需要像HTML净化器这样的东西。这将获取HTML并在白名单上运行它,然后重新生成可以安全显示给用户的HTML。

避免跨站点脚本编写的一个既好又便宜的方法是让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;

当您将&lt;传递给浏览器时,它会将其渲染为<,但不会对其执行任何其他操作。

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

您也可以选择在从数据库中检索用户提供的文本后和显示之前对其进行实体化。如果您需要几个人来处理您的代码,为了安全起见,您可能需要同时进行这两种操作。

您还可以在<pre>content</pre>标记中呈现用户提供的输入,这告诉浏览器只呈现文本,而不对其执行任何其他操作

(在这个页面上使用右键单击"检查"来查看堆栈溢出如何处理我的恶意示例。(

最新更新