第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編碼會導致格式不正確的鏈接。
如果此鏈接您的網址或鏈接從數據庫...因爲如果它來自URL .. y ou應過濾'$ _GET' – Baba
我沒有得到或處理此頁面上的任何參數。 –
你是什麼意思,你沒有得到這個網頁上的任何參數? – Baba