2013-06-03 362 views
6

我試圖避免通過URL
網址XSS攻擊:http://example.com/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29 我一直在使用正則表達式試圖防止通過URL(PHP)XSS攻擊

var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL)); 

等url_validation但不是在所有的工作。 上面的鏈接顯示所有的信息,但我的CSS和一些Java腳本功能不起作用。 請建議最好的解決方案...

+0

如果此鏈接您的網址或鏈接從數據庫...因爲如果它來自URL .. y ou應過濾'$ _GET' – Baba

+0

我沒有得到或處理此頁面上的任何參數。 –

+0

你是什麼意思,你沒有得到這個網頁上的任何參數? – Baba

回答

0

如果您使用的是MVC,那麼嘗試在路由之前解碼所有的值,並使用stript_tags()來消除這些缺陷。正如文件所說,案件不應該影響任何事情。

如果沒有,則創建一個實用程序函數並在從URI中檢索變量時執行相同的操作。但我絕不是XSS專家,所以這可能只是訣竅的一部分。

從詹尼斯Peisenieks

+1

不,我不使用MVC ... –

0

第1步:逃避用戶

如果你想包括一個已經由用戶提供的頁面中提供的數據輸出,躲避輸出。而且,在這個簡化列表中,我們將堅持一個簡單的轉義操作:HTML編碼任何<,>,&,',「。例如,PHP提供了htmlspecialchars()函數來完成這項常見任務。

第2步:始終使用XHTML

通過OWASP的XSS預防策略閱讀,並且很明顯,防範注射需要更多的努力,如果你在你的HTML中使用不帶引號的屬性。相比之下,在引用屬性中,轉義數據變成了轉義標記內的數據所需的相同過程,這是我們上面已經概述的轉義操作。這是因爲在引用屬性的上下文中隱藏結構重要內容的唯一麻煩製造者是結束語。

顯然,您的標記不一定是XHTML才能包含帶引號的屬性。但是,對XHTML進行拍攝和驗證可以輕鬆測試是否引用了所有屬性。

步驟3:只允許使用CSS和JavaScript

我們需要限制你的用戶,這些用戶的頁面的CSS和Javascript段內輸出爲字符(例如,允許數據,就像一個正則表達式字母數字數據值[a-zA-Z0-9] +)類型,並確保它們用於它們真正表示值的上下文中。在JavaScript中,這意味着用戶數據只應在分配給變量的引用字符串中輸出(例如,var userId =「ALPHANUMERIC_USER_ID_HERE」;.)在CSS中,這意味着用戶數據只應該在屬性值的上下文內輸出(例如,p )這可能看起來很嚴厲,但是,嘿,這應該是一個簡單的XSS教程

現在,要清楚,您應該始終驗證用戶數據以確保它符合您的期望,即使是在標籤或屬性內輸出的數據,就像前面的例子一樣。但是,這對於CSS和JavaScript區域尤其重要,因爲可能的數據結構的複雜性使得防止XSS攻擊變得非常困難。

您可能希望用戶能夠提供給您的JavaScript的常用數據(例如Facebook,Youtube和Twitter ID)都可以在滿足此限制的情況下使用。而且,CSS顏色屬性和其他樣式也可以被整合。

第4步:URL編碼,URL查詢字符串參數

如果用戶數據是鏈接查詢字符串的URL參數中輸出,確保URL編碼數據。再次以PHP爲例,您可以簡單地使用urlencode()函數。現在,讓我們清楚這一點,並通過幾個例子來工作,因爲我已經看到關於這個特定點的許多混淆。

必須URL編碼

下面的示例輸出,因爲它被用作在查詢字符串的值必須是URL編碼的用戶數據。

http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED」>

絕對禁止URL編碼

下面的示例輸出用於整個URL的用戶提供的數據。在這種情況下,應該使用標準轉義函數(HTML編碼任何<,>,&,',「)轉義用戶數據,而不使用URL編碼。對這個例子進行URL編碼會導致格式不正確的鏈接。

+0

我也使用過url_encode,但它無法阻止我在我的問題中提出的問題。 –

+0

第2步:始終使用XHTML。夥計HTML5怎麼樣? – Robert

+0

@Robert網站在覈心php和和很久以前所以,請讓我知道我可以驗證這些類型的url爲壞url ... –

4

使用try FILTER_SANITIZE_SPECIAL_CHARS相反

$url = 'http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29'; 

// Original 
echo $url, PHP_EOL; 

// Sanitise 
echo sanitiseURL($url), PHP_EOL; 

// Satitise + URL encode 
echo sanitiseURL($url, true), PHP_EOL; 

輸出

http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29 
http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/&#34;ns=&#34;alert(0x0000DC) 
http%3A%2F%2F10.0.4.2%2FonlineArcNew%2Fhtml%2Fterms_conditions_1.php%2F%26%2334%3Bns%3D%26%2334%3Balert%280x0000DC%29 

功能用於

function sanitiseURL($url, $encode = false) { 
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS); 
    if (! filter_var($url, FILTER_VALIDATE_URL)) 
     return false; 
    return $encode ? urlencode($url) : $url; 
} 
+1

以及我也試過這個,但我沒有存儲它,我必須執行這個鏈接,在行尾包含javascript函數,這個函數表示它有效的url,所以不能解決我的目的。 –