gpt4 book ai didi

javascript - 将 WMD 编辑器的预览 HTML 与服务器端 HTML 验证对齐(例如,没有嵌入的 JavaScript 代码)

转载 作者:数据小太阳 更新时间:2023-10-29 06:03:52 25 4
gpt4 key购买 nike

关于如何对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com