服務器安全:瀏覽器同源策略與跨域請求、XSS攻擊原理及防禦策略、如何防禦CSRF攻擊

主要包括

  • 瀏覽器同源策略與跨域請求
  • XSS攻擊原理及防禦策略
  • 如何使用SpringSecurity防禦CSRF攻擊
  • CC/DDOS攻擊與流量攻擊
  • 什麼是SSL TLS HTTPS?

一、瀏覽器的同源策略

請求方式:HTTP,HTTPS,Socket等

HTTP請求特點:無狀態。
想要保持狀態的話,需要服務器下發token/cookie到瀏覽器,在服務器端存的是session

服務端與客戶端要建立會話:
在這裏插入圖片描述
瀏覽器的同源策略
同源策略:當訪問同一域名下的所有子URI時,不需要重新登錄。
所謂的同源是指:1.協議相同 2.域名相同 3.端口相同

什麼是跨域請求?不同源的請求,就是跨域請求。
1.http://test/https://test/協議不同,不同源
2.http://test/http://www.test/二級域名不同,不同源
3.http://test:8080/http://test/端口號不同,不同源

瀏覽器允許跨域的請求
頁面中的一些標籤是不做同源限制的,比如<img> <script> <style>等標籤,這些標籤裏的src地址可以與當前頁不同源。
在這裏插入圖片描述
瀏覽器不允許跨域的請求
js裏用js發起的post/load等請求,瀏覽器不允許跨域。

解決方法:
1、CORS
在瀏覽器指定服務來源(需要較新版本瀏覽器支持),服務器端設置好同源策略之後,就可以跨域請求了。

resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Headers", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");

2、JSONp
底層原理:
js或者ajax在瀏覽器中已經被禁止掉了,但是可以通過
<script src="遠程服務器/xx.js">引用一個js文件來實現

  • 準備一個真正的js文件
  • 通過動態的方式,映射地址

拿到遠程js後,用callback函數寫渲染邏輯
在這裏插入圖片描述
jsonp只能<script src='...'>,因此只能使用get請求

二、XSS攻擊原理及防禦措施

富文本編輯器的外鏈圖片功能,如果不防禦XSS攻擊,可以填入一個www.fakepic?id=fake.jpg,每次訪問這個富文本頁面,因爲文本中添加了別的網站資源連接地址,所以自動發送了請求。
XSS最簡單理解是: 不可信的內容被瀏覽器渲染執行了
例如,百度開源的UEditor:
在這裏插入圖片描述
被填入的站點www.fakepic帶來的好處:增加了流量,帶來的壞處:流量過大會崩(同行競爭、敲詐勒索)
而富文本編輯器所在的網站不會被影響

XSS攻擊的目的:流量攻擊
防禦方式:禁止外站引用、限流、資源對抗(加貸款)、大數據+AI(360在做這個服務,也是分析IP)

三、CSRF

CSRF跨站請求僞造:多標籤瀏覽器,誘導進入假網站,假網站能拿到已登錄頁面的cookie,從而向真網站發送僞造的扣款請求
在這裏插入圖片描述

避免CSRF攻擊的方式:

方式1
全站均使用post請求,不用get請求。(<img src="...">等可以跨域的瀏覽器標籤只能發送get請求,而如果想發送post請求,需要用js實現,js不能發送跨域請求)

方式2
後臺過濾Referer,也就是校驗Referer頭,禁止跨站請求,但是Referer也可能被僞造。

@Override  
public String intercept(ActionInvocation invocation) throws Exception {  
    String referer = ServletActionContext.getRequest().getHeader("Referer");  
    if((referer!=null) && (referer.trim().startsWith(Constants.HTTP + Constants.domainName))){  
        return invocation.invoke();  
    }  
    return "error";  
}  

方式3
在表單中增加一個隨機的數字或字母驗證碼,通過強制用戶和應用進行交互,來有效地遏制CSRF攻擊。

方式4:使用token
參考:CSDN博客 - 跨域post及使用token防止csrf攻擊
HTTP 請求中以參數的形式加入一個隨機產生的 token,並在服務器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認爲可能是 CSRF 攻擊而拒絕該請求。

在站內頁面上head中,增加token

<meta name="csrf-token" content="{{ csrf_token() }}">

配置angular提交表頭

app.config(function ($httpProvider) {
    $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
});

敏感的操作應該使用POST,而不是GET,以form表單的形式提交,可以避免token泄露。

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章