2011-03-01 4 views
3

나는 (내가 아닌) 간단한 질문이 있습니다 정규 표현식은 달러 (A $)의 MSG가 발견 된 것은 교체하고 새로운 형태로 넣어 것이다 (I, 어떻게 예에 대해 설명하는 방법을 모른다) :PHP BBCode는 사용 preg_replace이다() 확인, 처음에이 제발 좀 봐, onclick을 입력하지 못하도록 방지, 때 onKeyPress

그것은

[b]TEXT[/b] 

켜집니다,451,515,

<b>TEXT</b> 

또는 문제가에서 온천 어디서 어떤 일이되어

다음
<b style="color: red;" title="HELLO">TEXT</b> 

이 밝혀진다면 그것은으로

[b style="color: red;" title="HELLO"]TEXT[/b] 

을 설정합니다 :

[b onclick="SOME TROJAN SCRIPT"]TEXT[/b] 

<b onclick="SOME TROJAN SCRIPT">TEXT</b> 

그리고 내가 원하는 것은 [b attribute1 attribute2 ... attributeN] 뒤에있는 모든 속성을 바꾸는 대신에 해당 속성을 그대로 유지합니다. (onClick, onMouseOver ...).

의견을 보내 주셔서 감사합니다 ^^! 고급 사용자 들께 감사드립니다 ...

+0

당신은 나를 위해 그것을 설명시겠습니까 – allenskd

답변

0

이것은 블랙리스트보다 화이트리스트에 훨씬 더 쉬울 것입니다. 특히 악의적 인 사용자가 자바 스크립트를 혼란스럽게 할 수있는 무수한 방법 때문입니다. 나는 받아 들일 수있는 출품작 목록을 만들고 대신 거기에서 일할 것입니다. 예, 기술적으로 CSS 항목이있을 수 있지만 실제로는 (1) 사용자가 자신의 HTML을 만들도록 허용하고 실제로 모든 종류의 XSS 두통을 초대 할 수 있습니다. (2) <b> 태그이므로 허용되는 CSS 명령의 작은 하위 집합으로 정상적으로 처리되어야합니다.

1

정규식은 거의 HTML/JavaScript 관련 보안 문제를 중지시키는 데 적합한 도구는 아닙니다.

Use a HTML parser.

+0

을 허용하는 속성의 허용 된 사이트 목록을 단지 수에 대한 테스트 케이스. 당신이 "DOMDocument - Manual"라고 준 링크는 내가 필요한 것을 찾지 못했을 것입니다. 아마도 그것을 볼 수 없을 것입니다! 하지만 답장을 보내 주셔서 감사합니다. :) – xx3004

+0

@ xx3004 필요한 모든 것이 있지만 매우 간단하지 않은 경우 [Googling] (http://google.com/search?q=php+domdocument+tutorial)을 사용해보십시오. 지도 시간. – alex

2

PECL은 BBCode package을 제공합니다. 또한 PEAR package eqiv, PECL 패키지를 설치할 수없는 경우. 일단 BBCode를 사용하면 훨씬 쉽게 작업 할 수 있습니다.

+0

나는 그것을 해결해야하고 곧 문제를 알려 드리겠습니다! Pauly 감사합니다! – xx3004

0

귀하의 불장난 그러나 이것은 즉각적인 문제를 치료해야합니다

s/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/<b$1>$2<\/b>/xi

또는 RX = /\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/
및 교체 = <b$1>$2<\/b>

와 다른 미묘한 수정.

편집 샘플 [b onclick="alert('HELLO');"]HELLO[/b]

use strict; 
use warnings; 

my @samps = (
'[b]TEXT[/b]', 
'[b on="]TEXT[/b]', 
'[b styleon="color: red;" title="HELLO"]TE 
     XT[/b]', 
'[b onclick="SOME TROJAN SCRIPT"]TEXT[/b]', 
'[b onclick="alert(\'HELLO\');"]HELLO[/b]', 
); 

for (@samps) { 
    print "Testing $_\n"; 
    if (s/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/<b$1>$2<\/b>/si) { 
     print " .. passed $_\n"; 
    } 
    else { 
     print " .. failed\n"; 
    } 
} 

출력

Testing [b]TEXT[/b] 
.. passed <b>TEXT</b> 
Testing [b on="]TEXT[/b] 
.. passed <b on=">TEXT</b> 
Testing [b styleon="color: red;" title="HELLO"]TE 
     XT[/b] 
.. passed <b styleon="color: red;" title="HELLO">TE 
     XT</b> 
Testing [b onclick="SOME TROJAN SCRIPT"]TEXT[/b] 
.. failed 
Testing [b onclick="alert('HELLO');"]HELLO[/b] 
.. failed 
+0

회신 xD를 보내 주셔서 감사합니다.하지만 [b onclick = "alert ('HELLO');"] HELLO [/ b]'를 입력하면 작동하지 않는 것 같습니까? 다시 감사합니다! – xx3004

+0

안녕하세요. 그것은 작동하거나 그렇지 않습니다. 아무 것도 보이지 않습니다. 그것이 작동하지 않으면, 당신은 잘못된 것을했습니다. 정확히 동일한 샘플을 사용하여 동일한 ** 정규 표현식을 사용하여 테스트 케이스를 올리려면 내 게시물을 편집하고 있습니다. 정규 표현식을 배우는 것을 고려하십시오. – sln