3

在安全地解析 bbcode 时,我遇到了一些困难,特别是 [img] 和 [url]。语言不太重要,但这是关于 JavaScript 的。)

  1. URL:不久前,用户可以在我的网站上写 [url=#" onclick="alert('test');"]Link[/url],当其他人点击链接时,会出现警报。但是,通过用任何内容替换所有双引号和单引号,即删除它们,警报hax不再起作用。我的问题是这是否对url足够安全?或者还有其他我需要注意的情况吗?

  2. 图片:img bbcode 需要哪些安全功能?删除引号并检查 url 的结尾是否以已知的图像文件类型(如 .png 或 .jpg)结尾是否足够?还是我需要做更多?

谢谢你的帮助!

4

1 回答 1

0

根据我的评论中的警告,我建议您将 URL 的字符列入白名单:az、0-9、&、.、/、?、:、= 等。然后将 替换为.*?您允许的字符:

/\[img\]([a-z0-9:&?=\/\.%]+?)\[\/img\]/ig
/\[url\=([a-z0-9:&?=\/\.%]+?)\](.*?)\[\/url\]/ig

这将涵盖我认为的大多数情况,但国际 URL 除外。此正则表达式中不允许使用引号,因此无需转义它们。它们的意思是表示为%22。此外,这不会验证 URL,但我相信只能防止 XSS。

[url] 和 [img] 都带有一个 URL,所以这部分正则表达式是相同的。而且您不应该检查 .png 或 .jpeg,因为许多图像没有带有显式扩展名的 URL。

那么正则表达式匹配中的 url 组将只需要为 HTML 进行转义。

完整代码

var imgRe = /\[img\]([a-z0-9:&?=\/\.%;]+?)\[\/img\]/ig;
var linkRe = /\[url\=([a-z0-9:&?=\/\.%;]+?)\](.*?)\[\/url\]/ig

$('#convert').click(function() {
    var output = $('#bbcode').val();

    // Escape HTML special characters
    // It's wrong to escape them before converting the bbcode into HTML
    // but I couldn't think of issues
    output = output.replace(/&/g, '&');
    output = output.replace(/</g, '&lt;');
    output = output.replace(/"/g, '&quot;');

    // Convert bbcode
    output = output.replace(imgRe, function(str, url) {
        return '<img src="' + url  + '"/>';
    });

    output = output.replace(linkRe, function(str, url, txt) {
        return '<a href="' + url  + '">' + txt + '</a>';
    });

    // print output
    $('#pre').html(output);
});
于 2012-11-10T19:37:02.457 回答