2016-07-12 8 views
2

HTML 정수기를 사용하여 사용자 입력을 위생적으로 처리하고 있습니다. 허용 된 요소 목록이 구성되어 있습니다. 즉, 허용 목록에없는 모든 태그가 제거됩니다. 아래 코드 :HTML 정수기 - 스트립 대신 허용되지 않는 태그를 이스케이프 처리합니다.

require_once "HTMLPurifier.standalone.php"; 
$config = HTMLPurifier_Config::createDefault(); 
$config->set('HTML.AllowedElements', array('strong','b','em','i')); 
$purifier = new HTMLPurifier($config); 
$safe_html = $purifier->purify($dirty_html)); 

보다는 단지 그 내용을 유지, 나는이 목록에 포함되지 않은 요소를 싶습니다 탈출과 텍스트로 다시 확인할 수 있습니다.


는, 상기 다음 입력 문자열을 나타내는 화이트리스트 주어진 설명하기 :

<a href="javascript:alert('XSS')"><strong>CLAIM YOUR PRIZE</strong></a> 

"<strong>CLAIM YOUR PRIZE</strong>" 변신, a가 화이트리스트되어 있지 않기 때문에. 유사하게,

<b>Check the article <a href="http://example.com/">here</a></b> 

"<b>Check the article here</b>"이된다. 정규 표현식 기반 "해킹"에 의지하지 않고 HTML 정수기의 구성 을 조정하여 순수

&lt;a href="javascript:alert('XSS')"&gt;<strong>CLAIM YOUR PRIZE</strong>&lt;/a&gt; 
<b>Check the article &lt;a href="http://example.com/"&gt;here&lt;/a&gt;</b> 

:

a를 다음으로 위의 두 가지 예를 설정하는 방법이 있나요? 있다면, 어떻게 완료되었는지 알고 싶습니다.

답변

2

Core.EscapeInvalidTags을 설정하는 것은 당신이 찾고있는 무엇을해야합니다 :

require_once(__DIR__ . '/library/HTMLPurifier.auto.php'); 

$dirty_html = '<a href="javascript:alert(\'XSS\')"><strong>CLAIM YOUR PRIZE<div></div></strong></a>'; 

$config = HTMLPurifier_Config::createDefault(); 
$config->set('HTML.AllowedElements', array('strong','b','em','i')); 
$config->set('Core.EscapeInvalidTags', true); 
$purifier = new HTMLPurifier($config); 
$safe_html = $purifier->purify($dirty_html); 

echo $safe_html . PHP_EOL; 

... 제공 :

&lt;a href="javascript:alert('XSS')"&gt;<strong>CLAIM YOUR PRIZE&lt;div /&gt;</strong>&lt;/a&gt; 

난 당신이 어떻게되는지 볼 수 있도록이 잘못된 자식 요소 <div></div>에 던졌다 : HTML Purifier는 구문 분석 (<div></div><div />이 됨)으로 인해 원본 HTML을 여전히 '변경'하지만 정보는 그대로 유지되며 &lt;div /&gt;으로 변환됩니다.