主要包括
- 瀏覽器同源策略與跨域請求
- 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泄露。