2010-10-28 46 views
0

例如,如果我colecting的形式[URL值],保存該[URL值]在數據庫中,然後利用它在一個頁面是這樣的:如何防止使用PHP在URL表單域中注入HTML?

<a href="[URL value]" > The Link </a> 

怎麼辦我避免這種情況[URL值]:

http://www.somelink.com"> Evil text or can be empty </a> ALL THE EVIL HTML I WANT <a href=" 

我怎樣才能防止這種HTML注入了URL形式的Fileds而不破壞的URL的情況下,它是有效的?

回答

6

當接收到表格上的網址:

  • 使用filter_var(url, FILTER_VALIDATE_URL),以確保該網址是有效的格式。
  • 確保URL以http://https://開始(或者至少拒絕所有javascript: URL,因爲它們可以包括惡性代碼)
  • 使用在數據庫中插入的URL(和其它形式的數據),或適當地逃脫數據時準備語句防止SQL注入。


顯示頁面時:

  • 使用htmlspecialchars()逃脫您在HTML中插入的URL(和所有其他文本)。
+0

這就是它!如果我將htmlspecialchars應用於每個URL(錯誤或有效),它不會破壞URL,但可以防止HTML注入。 – Bonfocchi 2010-10-28 15:09:22

-1

使用urlencode到打印網址時,比如編碼只是"標誌:

echo '<a href="'.str_replace('"', urlencode('"'), $url).'">link name</a>'; 
+0

如果我這樣做,我會得到一個本地鏈接。 – Bonfocchi 2010-10-28 00:45:46

+0

像http:// localhost:8888/http://www.submitedLink.com – Bonfocchi 2010-10-28 00:47:11

+2

這會破壞你的URL。 urlencode()用'%2F'替換'/',用'%3A'替換':',用'%3D'替換'&',這樣'http:// www.example.com'變成'http%3A %2F%2Fwww.example.com'。 'urlencode()'意味着對查詢字符串組件進行編碼,而不是整個URL。 – 2010-10-28 00:47:49

1

這樣做將是檢查輸入中包含什麼看起來像一個語法上有效的URL最簡單的方法,沒有字符,例如> URL中不允許的字符。最簡單的方法是使用filter extension。代碼來執行這將是這樣的:

if (filter_var($url, FILTER_VALIDATE_URL)) { 
    //Valid URL submitted 
} else { 
    //Invalid URL submitted 
} 
+0

有沒有辦法做到這一點沒有擴展名? – Bonfocchi 2010-10-28 00:48:50

+0

這不工作在PHP 4,我需要一個PHP 4解決方案.. – Bonfocchi 2010-10-28 00:56:25

+5

不要使用PHP 4它是古老的 – 2010-10-28 01:02:33

0

編輯:只是用用urlencode,每當你將數據放入URL的鍵/值對不使用ヶ輛以及

,你應該編碼該數據使用urlencode()。這個函數將處理任何特殊字符,這些特殊字符在構建URL的方式上具有語法意義。 &符號,等號和問號將爲您編碼。注入HTML中的所有尖括號和新行字符都將被編碼!

<?php $TheVariable = $_REQUEST['suspect_var']; // Untrusted data ?> 


<a href="http://www.mysite.com/script.php?untrusted_data=<?php echo urlencode($TheVariable) ?>">The Link</a> 
0

爲了顯示利用ヶ輛($ VAR,ENT_QUOTES)或用htmlspecialchars($ VAR,ENT_QUOTES)時逃脫。由於瀏覽器特定的XSS有效載荷,因此需要轉義單引號和雙引號。這裏檢查 - http://ha.ckers.org/xss2.html

此外,當驗證URL javascript:URI不是唯一危險的。另一個是data:URI。

無論如何,排除除白名單外的所有內容總是更安全,然後包括除黑名單之外的所有內容。