2013-09-27 180 views
0
<?PHP 
//fetch website data from db.. 

$website=htmlentities("javascript:alert()"); 
?> 

<a href="<?PHP echo $website;?>">Click me</a>//without http will get attack 
<a href="http://<?PHP echo $website;?>">Click me</a> 

我有一個web應用程序爲用戶添加他們的網站提供輸入。href安全,防止xss攻擊

但是我認爲安全問題,我做了測試。如果我添加http://它不會運行JavaScript。我的問題是,還有什麼我需要做的HREF安全?

$url="example.php?name=Peter&age=37"; 

if(!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)){echo "URL is not valid";} 
else{echo "URL is valid";} 

我有使用validate_url,但這一個返回無效。它從W3例如,W3顯示輸出有效

+0

您應該檢查網站之前將其存儲在數據庫 –

回答

1

爲了防止XSS通過錨href屬性,你需要做三件事情:

  1. 將裏面的值引用
  2. 編碼任何字符具有特殊意義
  3. 確保白名單網址的協議,如果存在

你已經在做前兩個以上(雖然爲此,0應優於htmlentities),所以你只需要照顧(3)。一種方法是通過在URL前強制使用http://,但這會破壞使用不同協議(例如HTTPS)的任何URL。

一個更好的解決方案是使用的允許的協議白名單,例如:

$allowed = [null, 'http', 'https']; // null = not specified 

$scheme = parse_url($website, PHP_URL_SCHEME); 
if ($scheme === false) { 
    // seriously malformed URL, what to do? 
} 
else if (!in_array($scheme, $allowed, true)) { 
    // protocol not allowed, don't display the link! 
} 
else { 
    // everything OK 
} 
+0

我沒有到https的HTTP測試,我把HTTP: //「www.google.com」它會自動更改爲https,但是我不確定其他人喜歡ftp等 – Ben

+0

@BenWong:它不會自動更改; Google會將您重定向到其安全服務。如果他們沒有爲你方便起見,那根本就行不通。 – Jon

+0

這很棘手,導致大多數用戶他們不輸入協議,他們只輸入www – Ben