2012-11-10 87 views
3

安全地解析bbcode時,特別是[img]和[url],我遇到了一些困難。語言是不太重要的,但是這是關於JavaScript的)安全使用IMG和URL bbcodes

  1. 網址: 不久前用戶能夠寫的[url =#」的onclick = 「警報( '測試');」]鏈接[/在我的網站上,當其他人點擊鏈接時會出現一個提醒,但是,通過用空白替換所有的雙引號和單引號,即刪除它們,警報hax不再工作,我的問題是這是否足夠網址安全嗎?還是有其他場景我需要注意?

  2. 圖片: 我需要什麼安全功能的img bbcode?是否足以刪除引號並檢查url結尾結束s是否具有已知的圖像文件類型,如.png或.jpg?還是我需要做更多?

感謝您的幫助!

+0

哪種語言,你解析BBcodes嗎? –

+0

@SebastianPaaskeTørholmJavascript – lawls

+0

是否有任何理由推出自己的bbcode解析?如果是這樣,你應該知道使用正則表達式解析只能得到你(簡單的東西,如標準化價格字符串,例如「$ 15.99」和「15.99」都必須返回「15.99」)。但是對於任何與bbcode相反的東西,您需要一個真正的解析器,這種解析器使用lex和yacc等工具構建。你可以在幾天內學習這些,不要訴諸於正則表達式,因爲你認爲它們更容易。你甚至可以使用Jison編寫JS解析器 – guillaume

回答

0

隨着我評論中的注意事項,我建議你只是將URL列入白名單字符:az,0-9,&,。,/,?,:,=等。然後用允許的字符替換.*?

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

這將覆蓋大多數情況下,我認爲,除了國際網址。這個正則表達式不允許使用引號,所以不需要轉義它們。他們的意思是表示爲%22。此外,這不會驗證網址,但只保護XSS我相信。

[url]和[img]都帶一個URL,所以這部分正則表達式是相同的。而且你不應該檢查.png或.jpeg,因爲許多圖像沒有帶有明確擴展名的URL。

然後,正則表達式匹配中的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, '&'); 
    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); 
});