XSS跨站腳本攻擊

跨站腳本攻擊問題和原理

跨站腳本攻擊(XSS,Cross-site scripting)是最多見和基本的攻擊Web網站的方法。攻擊者能夠在網頁上發佈包含攻擊性代碼的數據,當瀏覽者看到此網頁時,特定的腳本就會以瀏覽者用戶的身份和權限來執行。經過XSS能夠比較容易地修改用戶數據、竊取用戶信息以及形成其它類型的攻擊,例如:CSRF攻擊。惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意攻擊用戶的特殊目的。javascript

跨站腳本攻擊的解決思路

預防XSS攻擊的基本方法是:確保任何被輸出到HTML頁面中的數據以HTML的方式進行轉義(HTML escape)。例如PHP輸出:php

<textarea><?php echo $articleText; ?></textarea>

若是這個articleText是由用戶自行輸入的,那麼攻擊者頗有可能輸入一段包含javascript惡意攻擊代碼的文本,使得最終輸出變成:html

<textarea>
</textarea><script>alert('hello')'</script>
</textarea>

上述代碼,在瀏覽器中渲染,將會執行JavaScript代碼並在屏幕上alert hello。固然這個代碼是無害的,但攻擊者徹底能夠建立一個JavaScript來修改用戶資料或者竊取cookie數據。
解決方法很簡單,就是將輸出的值的值進行html escape,轉義後的輸出代碼以下前端

<textarea>
&lt;/textarea&gt;&lt;script&gt;alert(&quot;hello!&quot;)&lt;/script&gt;
</textarea>

這樣就不會有任何危害了。java

XSS危害

XSS實際上是一門小衆可是熱門的攻擊技術,之因此小衆,是因爲費時間、很難成功、攻擊沒法自動化和須要紮實的htmljs功底,可是因爲漏洞存在普遍,即便是大型互聯網公司的站點也很容易因爲疏忽存在此漏洞,這就是最大的熱門。
其實不管是哪種xss攻擊手段,其原理都是使用了「xss就是在頁面執行你想要的js」,也就是說,只要遵循一個原則——後端永遠不信任前端輸入的任何信息,不管是輸入仍是輸出,都對其進行html字符的轉義,那麼漏洞就基本不存在了。後端

跨站請求僞造攻擊(CSRF)

跨站請求僞造(CSRF,Cross-site request forgery)是另外一種常見的攻擊。攻擊者經過各類方法僞造一個請求,模仿用戶提交表單的行爲,從而達到修改用戶的數據或執行特定任務的目的。
一般狀況下CSRF攻擊都配合XSS來實現用戶身份的模仿。瀏覽器

解決思路

  1. 增長攻擊的難度。GET請求是很容易建立的,用戶點擊一個連接就能夠發起GET類型的請求,而POST請求相對比較難,攻擊者每每須要藉助JavaScript才能實現;所以,確保form表單或者服務端接口只接受POST類型的提交請求,能夠增長系統的安全性。安全

  2. 對請求進行認證,確保該請求確實是用戶本人填寫表單或者發起請求並提交的,而不是第三者僞造的。
    正常狀況下一個用戶提交表單的步驟以下:cookie

  • 用戶點擊連接(1) -> 網站顯示錶單(2) -> 用戶填寫信息並提交(3) -> 網站接受用戶的數據並保存(4)
    而一個CSRF攻擊則不會走這條路線,而是直接僞造第2步用戶提交信息session

  • 直接跳到第2步(1) -> 僞造要修改的信息並提交(2) -> 網站接受攻擊者修改參數數據並保存(3)
    只要可以區分這兩種狀況,就可以預防CSRF攻擊。那麼如何區分呢? 就是對第2步所提交的信息進行驗證,確保數據源自第一步的表單。具體的驗證過程以下:

  • 用戶點擊連接(1) -> 網站顯示錶單,表單中包含特殊的token同時把token保存在session中(2) -> 用戶填寫信息並提交,同時發回token信息到服務端(3) -> 網站比對用戶發回的token和session中的token,應該一致,則接受數據,並保存

這樣,若是攻擊者僞造要修改的信息並提交,是沒辦法直接訪問到session的,因此也沒辦法拿到實際的token值;請求發送到服務端,服務端進行token校驗的時候,發現不一致,則直接拒絕這次請求。

相關文章
相關標籤/搜索