2012-11-10 1 views
3

[img] 및 [url]과 같이 bbcode를 안전하게 구문 분석 할 때 어려움에 직면하고 있습니다. 자바 스크립트에 대한 언어는 덜 중요하지만입니다)IMG 및 URL bbcodes 보안

  1. 의 URL :. 얼마 전에 사용자가 쓸 수 있었다 [URL = # "onclick을 ="경고 ('테스트'); "] 링크 [/ URL] 내 사이트에, 그리고 다른 사람이 링크를 클릭하면 경고가 나타납니다. 그러나, 모든 더블 및 작은 따옴표를 아무것도 교체 즉, 제거, 경고 hax 더 이상 작동하지 않았다. 내 질문은 여기에 충분하다면 URL 보안 또는 내가 알고 있어야하는 다른 시나리오가 있습니까?

  2. 이미지 : img bbcode에는 어떤 보안 기능이 필요합니까? 따옴표를 제거하고 URL의 끝 부분을 확인하는 것으로 충분합니까? 종료 s .png 또는 .jpg와 같은 알려진 이미지 파일 유형? 아니면 더해야합니까?

도움 주셔서 감사합니다.

+0

언어 당신의 BBcodes을 구문 분석합니까? –

+0

@ SebastianPaaskeTorholm Javascript – 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 

국제 URL을 제외한 대부분의 경우에 해당됩니다. 따옴표는이 정규 표현식에서 허용되지 않으므로 이스케이프 할 필요가 없습니다. 그들은 %22으로 표기해야했습니다. 또한 URL의 유효성을 검사하지는 않지만 XSS에서만 믿을 수 있습니다.

[url]과 [img]는 모두 URL을 사용하므로 정규 표현식의이 부분은 동일합니다. 그리고 .png 또는 .jpeg는 많은 이미지에 명시적인 확장명을 가진 URL이 없기 때문에 확인하지 않아야합니다.

그런 다음 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, '&'); 
    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); 
});