我目前正在尝试使用官方降价包以及下划线的转义功能构建聊天应用,我的模板包含以下内容:
<span class="message-content">
{{#markdown}}{{text}}{{/markdown}}
</span>
当我从聊天输入框中获取文本时,我尝试转义任何HTML,然后添加换行符。然后将safeText
插入数据库并显示在上面的模板中。
rawText = $("#chat-input-textbox").val();
safeText = _.escape(rawText).replace(/(?:\r\n|\r|\n)/g, '\n');
标题,斜体和粗体等常见内容看起来还不错。但是,有两个主要问题:
代码转义问题 - 使用以下输入:
<script>alert("test")</script>
```
alert('hello');
```
This is _italics_!
除了alert('hello');
已成为alert('hello');
之外,一切看起来都不错。 <pre>
块不会呈现转义字符,这是有道理的。但问题是,下划线JS转义函数可以逃避一切。
已解决: 换行问题 - 使用以下输入:
first
second
third
我显示 first second third
没有换行符。我知道这可能是一个降价的事情。因为我认为你需要段落之间的空行才能在markdown中获得换行符。但是上述行为是最理想的,有人知道怎么做吗?
更新通过在我的正则表达式中添加额外的\n
来解决换行问题。所以现在我确保任何换行符都会用至少两个\n
字符表示(即\n\n
)。
答案 0 :(得分:0)
您应该查看showdown docs和Wiki文章they have on the topic。
Telescope使用的marked
npm包删除了不允许的 -tags。其中包括<script>
当然。正如我上面链接的文章所解释的那样,还有另外一个问题:
<a href='javascript:alert("kidding! Im more the world domination kinda guy. Muhahahah")'>
click me for world peace!
</a>
标记不会阻止。我会遵循作者的建议并使用HTML卫生库。与OWASP's ESAPI或Caja's html-sanitizer一样。这两个项目似乎都过时了。我还找到了一个名为showdown-xss-filter的摊牌扩展名。所以我的建议是编写自己的帮助器,并使用showdown-xss-filter。