2010-07-15 74 views
2

這裏是我的功能:針對XSS一個URL PHP filter_var攻擊

function is_url($url) { 
    return (preg_match('#^(https?):\/\/#i', $url) && (filter_var($url, FILTER_VALIDATE_URL) !== FALSE)); 
} 

這裏是一個很好的鏈接,它驗證爲真:

http://blah.com"onclick="alert(document.cookie) 

試想一下,如果是進入<a href="<?php echo $url; ?>">

是否有更好的URL驗證與正則表達式?或者是我正在測試的URL實際上是一個有效的URL(在這種情況下,我需要一個XSS清理功能)?

回答

2

有此內置filter

filter_var($url, FILTER_VALIDATE_URL); 

這將返回false你的榜樣URL。如果它是有效的,它將返回$url。例如:

 
[email protected]:~$ php -r "var_dump(filter_var('http://blah.com\"onclick=\"alert(document.cookie)', FILTER_VALIDATE_URL));" 
bool(false) 

無論如何,防止XSS的解決方案是使用htmlspecialchars。因爲它是一個屬性,你應該使用ENT_QUOTES

htmlspecialchars($data, ENT_QUOTES); 

但你也應該驗證URL,因爲否則用戶可以包括javascript:般的「網址」。

+0

閱讀我的代碼: -/ – fire 2010-07-15 10:10:30

+0

對不起,線路太長,我沒有看過那部分。但無論如何,它確實會返回錯誤。 – Artefacto 2010-07-15 10:12:25

+0

這很奇怪,當你運行http://pastebin.com/9Yvg7Gqn時發生了什麼,因爲它傾銷爲布爾(真)? – fire 2010-07-15 10:15:58