2010-08-09 90 views
7

如何避免跨站點腳本攻擊?如何避免「跨站點腳本攻擊」

Cross-site script attacks(或跨站點腳本)是比如你有你的主頁的留言和客戶端哪些職位FX 一些JavaScript代碼重定向你到另一個網站或電子郵件發送你的cookies到惡意用戶或者它可能是許多其他的東西,可以證明是真正有害的,你和訪問你的網頁的人。

我相信它可以完成fx。在PHP驗證表格但我沒有足夠的經驗fx。禁止JavaScript或其他可以傷害你的東西。

我希望你明白我的問題,並且你能夠幫助我。

+0

目標框架? PHP? – Arthur 2010-08-09 11:50:20

+0

有任何語言/框架/等選項。如果您提供有關您的設置的更多信息,您會得到更具體的答案 - 如htmlencode。 (棧)。 – Tobiasopdenbrouw 2010-08-09 11:51:02

+0

你是對的,Tobiasopdenbrouw,但它實際上更像是一個普通的問題,其他人也可以從中獲得:) – Latze 2010-08-09 11:57:34

回答

12

我敢肯定,這是可以做到的FX。在PHP中通過驗證表格

不是真的。輸入階段完全是解決XSS問題的錯誤地方。

如果用戶在輸入中輸入了<script>alert(document.cookie)</script>,那麼它本身沒有任何問題。我只是在這個消息中做到了,如果StackOverflow不允許,我們會在網站上討論JavaScript時遇到很大困難!在大多數情況下,您希望允許任何輸入(*),以便用戶可以使用<字符字面意思是小於號。

問題是,當你在HTML頁面中寫入一些文本時,你必須正確地爲它所處的上下文轉義它。對於PHP,這意味着在輸出級使用htmlspecialchars()

<p> Hello, <?php echo htmlspecialchars($name); ?>! </p> 

[PHP提示:你可以自己定義一個名稱較短的功能做echo htmlspecialchars,因爲這是相當多的打字做好每一個的您需要將變量放入HTML中。]

無論文本來自何處,無論是否來自用戶提交的表單,這都是必要的。雖然用戶提交的數據是忘記HTML編碼的最危險的地方,但重要的是您要採用一種格式的字符串(純文本)並以另一種格式(HTML)將其插入到上下文中。無論何時你將文本投入到不同的上下文中,你都需要一個適合該上下文的編碼/轉義方案。

例如,如果將文本插入到JavaScript字符串文字中,則必須轉義引號字符,反斜線和換行符。如果將文本插入到URL中的查詢組件中,則需要將大部分非字母數字轉換爲%xx序列。每個環境都有自己的規則;你必須知道在你選擇的語言/框架中,每個環境的功能是什麼。你不能通過在輸入階段改變表單提交來解決這些問題 - 雖然很多天真的PHP程序員都會嘗試,這就是爲什麼如此多的應用在角落案例中混淆了你的輸入並且仍然不安全。

(*:好吧,幾乎任何一個。從提交的文本中篩選出ASCII控制字符是一個合理的參數,它不太可能允許它們做任何好的事情 當然,你會有特定於應用程序的驗證你會想要做的,就像確保電子郵件字段看起來像電子郵件地址或數字確實是數字一樣,但這不是可以全部應用於所有輸入以避免麻煩。 )

9

當服務器接受來自客戶端的輸入,然後盲目地將該輸入寫回頁面時,會發生跨站點腳本攻擊(XSS)。這些攻擊的大部分保護包括轉義輸出,所以Javascript變成純HTML。

有一點需要記住的是,它不僅是直接來自客戶端的數據可能包含攻擊。 A 存儲的XSS攻擊涉及到將惡意JavaScript寫入數據庫,其內容隨後將由Web應用程序查詢。如果數據庫可以與客戶端分開編寫,那麼應用程序可能無法確定數據是否已正確轉義。出於這個原因,Web應用程序應該將它寫入客戶端的所有數據視爲可能包含攻擊。

參見如何保護自己這個環節進行徹底的資源:http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

+0

偉大的一點 - 我看到太多的談話通常是「擦洗輸入」,實際上這並不總是可能的,或者即使是明智的,也不能完全解決問題。解決方案需要在輸出時發生。此外,重要的是要注意,HTML並不是唯一易受攻擊的上下文--SQL注入實際上只是同一主題上的變體。 – Pointy 2010-08-09 12:11:06

+0

驗證輸入,轉義輸出 – 2010-08-09 12:22:22