使用htmlpurifier

时间:2016-01-12 19:42:48

标签: javascript jquery wysiwyg htmlpurifier jqte

我正在使用jqte给cms的用户我为他们的内容写了一些WYSIWYG。 要公开输出内容我使用htmlPurifier,所以没有办法,编辑会伤害网站的访问者。

然而,他们可以放置

<button onclick="alert('this sux')">klick me</button>

在textarea中,下一个用户将找到一个工作按钮。

<script>evilcode</script>

甚至被执行。

有没有人在我面前处理这个问题,可以在这里给我一个优雅的解决方案提示?

2 个答案:

答案 0 :(得分:1)

我要在这里出去,并说当你将以前提交的数据加载到表单中时,你的输出周围没有htmlspecialchars() - 你应该这样做,因为< strong>它仍然是 textarea 文本。您的WYSIWYG将文本解释为HTML,但不要将其与实际HTML混淆。 :)

作为安慰,要知道这种混乱非常普遍(it keeps happening)并且有很多人的问题与你描述的问题完全一样。

让我们来看看工作流程以及可能出现问题的地方:

问题工作流程

如果有人在WYSIWYG字段中将<tag>写入您的WYSIWYG字段中的richtext中,编辑器会看到有人想将HTML &lt;tag&gt;放入邮件中。

当有人将粗体文字写入richtext时,编辑会发现有人想要将HTML <b>bold text</b>(或可比较的)放入邮件中。

同时,在后台,文本&lt;tag&gt; <b>bold text</b>(或其他)存储在 textarea 中。要在HTML上下文中将文本保留为 text ,它会使用HTML编码进行编码,将其无形地转换为&amp;lt;tag&amp;gt; &lt;b&gt;bold text&lt;/b&gt;

但是,按下提交按钮时,textarea(&lt;tag&gt; <b>bold text</b>)的文本会发送到您的服务器,因为表单数据本身当然不是HTML编码(它没有嵌入HTML) - 它只是一组键和值,你想要textarea的值。

现在,当您在服务器端应用程序中构建HTML以再次加载邮件以进行进一步编辑时,您希望该字段的是HTML编码的,因为您和#39;将该值重新放入HTML上下文中。您之前所做的是创建<textarea>&lt;tag&gt; <b>bold text</b></textarea>,它将HTML放入HTML上下文中。在基本上所有浏览器中,这使得textarea采用 <tag> <b>bold text</b>。哎哟! (想象一下,如果有人</textarea>作为原始信息的一部分!)

令所有人感到困惑的是,WYSIWYG的编辑很擅长表现出你想要的东西。对于大多数用例,你甚至没有注意到差异,这就是为什么这个错误如此普遍。

但是,在构建网页的HTML时,实际上想要构建<textarea>&amp;lt;tag&amp;gt; &lt;b&gt;bold text&lt;/b&gt;</textarea>。这使得textarea具有 &lt;tag&gt; <b>bold text</b> - 这正是你想要的。

你的Current Solution,以及它为什么会中断

您当前拥有的解决方案通过htmlspecialchars_decode()运行提交的文本,将&lt;tag&gt;转换为<tag>,从而让HTML Purifier消除它。您不再需要担心在所见即所得的情况下&lt;tag&gt;被解释为<tag>

然而,遗憾的是,您有两个问题:

1)如果没有HTML Purifier剥离它们,人们将无法再提交关于标记的消息。根据您的textarea的使用情况,这可能不是问题。也许您不希望人们能够提交If you're making your own website, you can use &lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js" language="javascript"&gt; instead of hosting the jquery.js yourself等HTML消息 - 使用您当前的解决方案,这样的消息将被HTML Purifier清理为If you're making your own website, you can use instead of hosting the jquery.js yourself

2) 更加危险,人们仍然可以破解你!尝试将文本 &lt;script&gt;alert(1);&lt;/script&gt;写入编辑器(以便编辑器看到 HTML 您要提交为&amp;lt;script&amp;gt;alert(1);&amp;lt;/script&amp;gt;)并点击提交。您的解决方案会将其转换为&lt;script&gt;alert(1);&lt;/script&gt;,您将<textarea>放入htmlspecialchars_decode(),然后不幸地回到原点。

实际解决方案

删除htmlspecialchars()解决方案(但继续进行净化!),然后将 <div style="position: relative; width:100%"> <div style="position: relative; left: 50%; float: left;"> <div style="position: relative; right: 50%;"> <!-- the image width is unknown --> <img src="https://react-bootstrap.github.io/assets/logo.png" /> </div> </div> </div> 放在输出周围。您的WYSIWYG仍然有效,您不会再绕过HTML Purifier的卫生设施。

答案 1 :(得分:0)

jqte掩盖了标签,所以

[HttpGet]
public string MakeUser(string name, string surname, int number) 
{
}

变为

<

并且HTMLpurifier错过了。因此,在您净化之前,您需要解码所有html屏蔽。你可以通过

来做到这一点
&lt;

这里是我可以输入字符串或数组的完整类,只要你安装了htmlpurifier(即使用作曲家)

htmlspecialchars_decode($string, ENT_HTML5);

作为第一,但仍然可以破解,请参阅标记为解决方案的答案。 这个答案留待这里作为解决方案的有用上下文。