IMG和URL bbcodes的安全性

时间:2012-11-10 10:14:47

标签: javascript regex bbcode

我在安全地解析bbcode时面临一些困难,特别是[img]和[url]。语言不太重要,但这与JavaScript有关。)

  1. 网址: 不久前,用户能够在我的网站上写下[url =#“onclick =”alert('test');“]链接[/ url],当其他人点击该链接时,会出现一个提醒。但是,通过全部替换没有任何内容的双引号和单引号,即删除它们,警报hax没有进一步工作。我的问题是,这是否足够安全的网址?还是有其他任何我需要注意的场景?

    < / LI>
  2. 图片: img bbcode需要哪些安全功能?是否足以删除引号并检查网址的末尾是否以已知的图像文件类型结尾,例如.png或.jpg?或者我还需要做更多吗?

  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

根据我的评论中的注意事项,我建议你只为网址列入白名单:az,0-9,&amp;,。,/,?,:,=等。然后将.*?替换为你允许的角色:

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

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

[url]和[img]都采用了URL,因此正则表达式的这一部分是相同的。并且您不应该检查.png或.jpeg,因为许多图片没有明确扩展名的网址。

然后,regexp匹配中的url组只需要转义为HTML。

Full code

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, '&amp;');
    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);
});