我打算使用EpicEditor作为博客引擎的编辑器,我当前的堆栈是 AngularJS、ServiceStack 和 RavenDB。这里的问题是,我想向数据存储提供安全的 html 和 markdown 标记,当然在获取时恢复实际的表示,问题是我想保留安全的 html 标签并添加一些功能来嵌入视频,例如,
第一次试验使用以下顺序:
- 编辑完成
- 发布到 api
- 来自编辑器的原始文本被编码并保存
现在显示编辑的数据:
- 获取编码字符串
- 将其作为响应返回
- 使用内置解析器 (Marked.js) 解析它
前面的流程当然是坏掉了,比如<h1>
渲染标签来显示,这主要是因为HttpUtility/WebUtility
处理html编码的方式。例如,很难区分要显示code
的内容以及要像嵌入<iframe>
视频那样渲染的内容。
当我发布一些 markdown/html 标记时,如下所示:
#Hello, World
>>> http://www.youtube.com/watch?v=Skl71urqKu0
<iframe width="420" height="315" src="http://www.youtube.com/embed/veJZDANY6go" frameborder="0" allowfullscreen></iframe>
<h1>huhuhu</h1>
<script>alert("fail")</script>
<script>alert("win")</script>
这是我从我的WebUtility.HtmlEcode()
:
{
"status": "#Hello, World\n\n>>> http://www.youtube.com/watch?v=Skl71urqKu0\n\n<iframe width='420' height='315' src='http://www.youtube.com/embed/veJZDANY6go' frameborder='0' allowfullscreen></iframe>\n\n<h1>huhuhu</h1>\n\n<script>alert('fail')</script>\n\n <script>alert('win')</script>"
}
之前的编码字符串在使用Marked.js解析后在显示实际代码方面也中断了,例如,我神奇地添加&
到我的 XSS 尝试中,这甚至中断了代码的显示。为了澄清,它看起来像这样:
<pre><code>&lt;script&gt;alert(&#39;win&#39;)&lt;/script&gt;</code></pre>
我知道有可以清理代码的antixss库,但这是否可以完全安全地存储在数据库中?
另外我正在考虑解析实际链接并在服务器上构建嵌入字符串,而不是允许处理原始 html,这可行吗?
很抱歉这篇冗长的帖子,并在此先感谢!