2011-04-07 256 views
0

我正在嘗試使用preg_replace來過濾成員評論。過濾腳本和img標籤。如果src爲從我的網站,允許它使用標籤,如果從其他網站,只顯示SRC幫助正則表達式?

正則表達式表達:

<(\w+).+src=[\x22|'](?![^\x22']+mysite\.com[^\x22']+)([^\x22']+)[\x22|'].*>(?:</\1>)? 

使用:

preg_replace($pattern, $2, $comment); 

評論:

Hi look at this! 
<img src="http://www.mysite.com/blah/blah/image.jpg"></img> 
<img src="http://mysite.com/blah/blah/image.jpg"></img> 
<img src="http://subdomain.mysite.com/blah/blah/image.jpg"/> 
<img src="http://www.mysite.fakesite.com/blah/blah/image.jpg"></img> 
<img src="http://www.fakesite.com/blah/blah/image.jpg"></img> 
<img src="http://fakesite.com/blah/blah/image.jpg"></img> 
Which one is your favorite? 

通緝結果:

Hi look at this! 
<img src="http://www.mysite.com/blah/blah/image.jpg"></img> 
<img src="http://mysite.com/blah/blah/image.jpg"></img> 
<img src="http://subdomain.mysite.com/blah/blah/image.jpg"/> 
http://www.mysite.fakesite.com/blah/blah/image.jpg (notice that it's just url, because it's not from my site) 
http://www.fakesite.com/blah/blah/image.jpg 
http://fakesite.com/blah/blah/image.jpg 
Which one is your favorite? 

有人看到有什麼問題嗎?

回答

1

我能看到的最大的錯誤是嘗試使用正則表達式來修改HTML。您可以使用DOMDOcument

$dom = new DOMDocument('1.0', 'UTF-8'); 

$dom->loadHTML($content); 

foreach($dom->getElementsByTag('img') as $element) { 

    if (! $element->hasAttribute('src')) { 
     continue; 
    } 

    $src = $element->getAttribute('src'); 

    $elementHost = parse_url($src, PHP_URL_HOST); 
    $thisHost = $_SERVER['SERVER_NAME']; 

    if ($elementHost != $thisHost) { 
     $element->parentNode->insertBefore($dom->createTextNode($src), $element); 
     $element->parentNode->removeChild($element); 
    } 

} 
+0

好的,會檢查出來。謝謝。 – Darius 2011-04-07 03:35:41

2

我試圖使用的preg_replace來過濾成員的意見。過濾腳本和img標籤。

HTML Purifier將是用於此目的的最佳工具,但你要接受的標記和屬性的白名單,不特定有害標籤的黑名單。

+2

+1你肯定會想要使用現有的庫; HTML清理是一項看似複雜的任務(如果您不確定,那裏已經有數十個不同的漏洞利用)(http://ha.ckers.org/xss.html))。 [這是一篇博客文章](http://blog.astrumfutura.com/2010/08/html-sanitisation-the-devils-in-the-details-and-the-vulnerabilities/),其中探討了一些風險並比較了一些可用的工具。 – 2011-04-07 03:19:40

+0

謝謝,我會研究一下。 – Darius 2011-04-07 03:35:08

0

你應該使用im模式;

#<(\w+).+src=[\x22|'](?![^\x22']+mysite\.com[^\x22']+)([^\x22']+)[\x22|'].*>(?:</\1>)?#im