- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
关于如何对 WMD 编辑器生成的 Markdown 进行服务器端清理以确保生成的 HTML 不包含恶意脚本,如下所示:
<img onload="alert('haha');"
src="http://www.google.com/intl/en_ALL/images/srpr/logo1w.png" />
但我也没有找到堵住客户端漏洞的好方法。当然,客户端验证不能替代服务器上的清理验证,因为任何人都可以假装是客户端并向您发送令人讨厌的 Markdown。而且,如果您在服务器上删除 HTML,攻击者将无法保存错误的 HTML,这样其他人以后就无法看到它,并且他们的 cookie 被盗或 session 被错误的脚本劫持。因此,有一个有效的案例表明,在 WMD 预览 Pane 中执行无脚本规则可能也不值得。
但想象一下,攻击者找到了一种将恶意 Markdown 放到服务器上的方法(例如,来自另一个站点的受损提要,或者在修复 XSS 错误之前添加的内容)。在将 markdown 翻译成 HTML 时应用的服务器端白名单通常会阻止向用户显示该错误的 Markdown。但是,如果攻击者可以让某人编辑页面(例如,通过发布另一个条目说恶意条目有一个损坏的链接并要求某人修复它),那么任何编辑该页面的人都会劫持他们的 cookie。诚然,这是一个极端案例,但它仍然值得防御。
此外,允许客户端预览窗口允许与您的服务器允许的不同的 HTML 可能不是一个好主意。
Stack Overflow 团队通过更改 WMD 填补了这个漏洞。他们是怎么做到的?
[注意:我已经解决了这个问题,但它需要一些棘手的 JavaScript 调试,所以我在这里回答我自己的问题以帮助可能想要做同样事情的其他人]。
最佳答案
一个可能的修复是在 wmd.js 中的 pushPreviewHtml()
方法中。这是来自 Stack Overflow version of WMD on GitHub 的原始代码:
if (wmd.panels.preview) {
wmd.panels.preview.innerHTML = text;
}
您可以将其替换为一些清理代码。这是 Stack Overflow 使用的代码的改编版 in response to this post ,它限制为标签白名单,对于 IMG 和 A 元素,限制为属性白名单(并且也以特定顺序!)。请参阅元堆栈溢出帖子 What HTML tags are allowed on Stack Overflow, Server Fault, and Super User? 有关白名单的更多信息。
注意:这段代码当然可以改进,例如允许以任何顺序列入白名单的属性。它还不允许 mailto: URL,这在 Internet 站点上可能是一件好事,但在您自己的 Intranet 站点上它可能不是最好的方法。
if (wmd.panels.preview) {
// Original WMD code allowed JavaScript injection, like this:
// <img src="http://www.google.com/intl/en_ALL/images/srpr/logo1w.png" onload="alert('haha');"/>
// Now, we first ensure elements (and attributes of IMG and A elements) are in a whitelist,
// and if not in whitelist, replace with blanks in preview to prevent XSS attacks
// when editing malicious Markdown.
var okTags = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;
var okLinks = /^(<a\shref="(\#\d+|(https?|ftp):\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;
var okImg = /^(<img\ssrc="https?:(\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;
text = text.replace(/<[^<>]*>?/gi, function (tag) {
return (tag.match(okTags) || tag.match(okLinks) || tag.match(okImg)) ? tag : ""
})
wmd.panels.preview.innerHTML = text; // Original code
}
另请注意,此修复不在 Stack Overflow version of WMD on GitHub 中-- 很明显,更改是稍后进行的,并没有重新 checkin GitHub。
更新:为了避免破坏在您输入 URL 时自动创建超链接的功能,您还需要对 showdown.js 进行更改,如下所示:
原代码:
var _DoAutoLinks = function(text) {
text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");
// Email addresses: <address@domain.foo>
/*
text = text.replace(/
<
(?:mailto:)?
(
[-.\w]+
\@
[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
)
>
/gi, _DoAutoLinks_callback());
*/
text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
function(wholeMatch,m1) {
return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
}
);
return text;
}
固定代码:
var _DoAutoLinks = function(text) {
// use simplified format for links, to enable whitelisting link attributes
text = text.replace(/(^|\s)(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\]])($|\W)/gi, "$1<$2$3>$4");
text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, '<a href="$1">$1</a>');
return text;
}
关于javascript - 将 WMD 编辑器的预览 HTML 与服务器端 HTML 验证对齐(例如,没有嵌入的 JavaScript 代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2837593/
我可以从 WMD 获取 Markdown 和 HTML 格式的文本编辑。在我的要求中,我还需要从 获取纯文本大规模杀伤性武器 编辑。我想用一个简单的例子来解释它。 在 Stack Overflow 中
我有兴趣在另一个项目中使用 WMD 编辑器*,但我不太确定应该使用哪个版本。 从堆栈溢出中拖网 blog我发现在 google code 上提到了一个版本, 加 cky's version on gi
我正在使用 WMD 来计算句子之间的相似度。例如: distance = model.wmdistance(sentence_obama, sentence_president) 引用:https:/
我目前正在尝试将 WMD 编辑器添加到我的站点。到目前为止我一切正常,但现在我遇到了问题:如何将键入的信息存储到我的数据库中?我创建了一个 JS/Ajax 函数,它将 textarea 的值分配给 $
我使用 WMD 编辑器,就像这里使用的那样。 我有一个通过弹出窗口完成的自定义上传功能,并自动处理标记的插入,例如wmd 编辑器根本不需要处理这个问题。 我已经使用了编辑器 Hook ,如 docs
Prettify需要将class="prettyprint"添加到或中。如何让WMD执行此操作? 最佳答案 看看PageDown Markdown编辑器... AFAIK,WMD已死,但是PageDo
我正在寻找方法来清理 WMD 的输入编辑。 具体来说,我试图让 HTML 标签只在 中可用。 WMD 生成的标签。那可能吗 我的问题是以下代码呈现为 HTML,这对潜在的 XSS attacks 来
我正在尝试实现 StackOverflow 上使用的 WMD 编辑器来创建一些基本的 Wiki 风格的功能。我已经到了要保存到数据库的时间了,但是我不确定应该保存什么。 如果我保存生成的 HTML,那
我使用wmd我的所有项目,但最近我想添加对隔离代码块的支持,我发现可以使用预处理器来实现。我正在使用这样的东西: const content = wmd(myMarkdownString, {prep
我正在尝试在我的站点中使用 WMD 编辑器 (http://wmd-editor.com/)。我有一个非常简单的问题。当我准备好将文本提交给服务器时;我如何获得编辑器的输出? 像这样的东西只返回“用户
有没有办法将自定义按钮添加到 WMD Editor扩展编辑器的功能? 我想添加的各种按钮的想法是: 标记选定的文本 插入一些预定义的文本 谢谢 图格斯 最佳答案 是的,你可以。 1) 你需要扩展图像“
我知道如何使用 widget= 在常规 django 表单中使用 WMD 和其他此类 javascript 编辑器。但是,如何将 WMD 用于 Django 管理中的文本字段?最重要的是,我如何将它用
我是 jQuery 新手(说实话,我使用它只是因为 this WMD 编辑器需要它)。 无论如何,我正在查看 jQuery 代码(转到上面的链接并查看 jquery.wmd.js),并且有选项默认值:
我看了原文wmd-editor不再维护,因此努力对其进行逆向工程,hosted on github .但是这个版本还没有准备好,因为它引用了许多未定义的函数,例如: processHeadings i
我想将 WMD 与 PHP Markdown Extra 一起使用.我不需要编辑器中的任何新按钮,但我需要实时预览来反射(reflect)额外 Markdown 功能的使用,最显着的是 tables
我正在使用 markdown editor在我的应用程序中。 $(document).ready(function () { var converter = Markdown.getSanit
如果你们中有人曾经使用过wmd markdown 编辑器(类似于 stackoverflow 使用的编辑器)那么也许你可以帮助我: 默认情况下,WMD 将自己分配给页面上找到的第一个文本区域。然而,我
This Google code repository called "wmd-new"似乎是 WMD Markdown 编辑器的最新和最活跃的版本。它具有最近的修改日期。 但是,它有一个 link标
我在 100 万个摘要数据集(20 亿个单词)上使用 word2vec。为了找到最相似的文档,我使用了 gensim.similarities.WmdSimilarity 类。当尝试使用 wmd_si
我正在开发一个使用 MarkDown 和 WMD javascript 工具的网站,这些工具目前可以满足已经托管的图像的需求,但我希望能够根据 Stack Overflow 在 WMD 中提供图像上传
我是一名优秀的程序员,十分优秀!