一,XSS
XSS攻擊全稱跨站腳本攻擊,XSS是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。
常見的 XSS 攻擊有三種:
DOM-based 型、反射型、存儲型。
其中:
反射型、DOM-based 型可以歸類為非持久型 XSS 攻擊。
存儲型歸類為持久型 XSS 攻擊。
①DOM-based型攻擊:
利用dom本身的缺陷,進行攻擊
栗子:就是頁面中的某個圖片,獲取圖片的路徑:
<img src="{{img.src}}"> //返回的 img.src=/xxxx" onerror=xxx" //這樣放到img的src中就成了這樣<img src="/xxx" onerror=xxx"> //src肯定會加載失敗,然后執行了onerror中注入的惡意代碼,達到攻擊效果
②存儲型
前端頁面中表單提交的數據存在惡意代碼被保存到目標網站的服務器中,這種攻擊具有較強的穩定性和持久性。
③反射型
惡意代碼並沒有保存在目標網站,通過引誘用戶點擊一個鏈接到目標網站的惡意鏈接來實施攻擊的。
栗子:
有這樣一個url:http:xxxxx.con?name=xxx(xxx是惡意代碼) //傳到后端的參數name 被后端接收之后,響應的頁面包含name這個變量的,會把這個name的內容注入到頁面上面,達到攻擊的效果
X-XSS-Protection頭 (現代瀏覽器的防范措施)
X-XSS-Protection:0 // 0: 表示關閉瀏覽器的XSS防護機制
X-XSS-Protection:1 // 1:刪除檢測到的惡意代碼, 如果響應報文中沒有看到X-XSS-Protection 字段,那么瀏覽器就認為X-XSS-Protection配置為1,這是瀏覽器的默認設置
X-XSS-Protection:1;mode=block // mode=block : 給出警告信息,阻止頁面的渲染執行
X-XSS-Protection:1;report=<reporting-uri> // report=<reporting-uri> : 進行上報
xss防御手段:
①過濾
對用戶的輸入進行過濾,移除用戶輸入的Style節點、Script節點、Iframe節點
②編碼
HTML Entity 編碼
③將重要的cookie 設置成http only 這樣就不能通過js獲取到該cookie了
二,CSRF(跨站請求偽造)
從上圖可以看出,要完成一次CSRF攻擊,被攻擊的網站必須滿足兩個必要的條件:
①登錄受信任網站A,並在本地生成Cookie。(如果用戶沒有登錄網站A,那么網站C在誘導的時候,請求網站A的api接口時,會提示你登錄)
②在不登出A的情況下,訪問危險網站C(其實是利用了網站A的漏洞)。
溫馨提示一下,cookie保證了用戶可以處於登錄狀態,但網站C其實拿不到 cookie。
CSRF如何防御:
①使用token:
服務器發送給客戶端一個token,客戶端提交表單時帶上該token,服務器驗證token是否有效,有效就允許訪問,否則拒絕訪問。
②Referer 驗證
Referer 指的是頁面請求來源,意思是,只接受本站的請求,服務器才做響應;如果不是,就攔截。
三,SQL注入攻擊
在編寫SQL語句時,如果直接將用戶傳入的數據作為參數使用字符串拼接的方式插入到SQL查詢中,那么攻擊者可以通過注入其他語句來執行攻擊操作,這些攻擊包括可以通過SQL語句做的任何事:獲取敏感數據、修改數據、刪除數據庫表等
防范策略:
①驗證輸入類型
比如某個視圖函數接收整形id來查詢,那么就在URL規則中限制URL變量為整型。
②參數化查詢
③轉義特殊字符
比如引號、分號和橫線等。使用參數化查詢時,各種接口庫會為我們做轉義工作。
四,點擊劫持(ClickJacking)
點擊劫持就是利用視覺欺騙用戶將一個危險網站設置透明,然后在其上方設置一個按鈕,當你點擊這個按鈕的時候,就觸發底部透明的危險網站的事件,從而欺騙用戶點擊一個按鈕或者輸入一個值。
或者是將一個網站通過iframe進來,通過透明度設置不可見,誘導用戶點擊可見的一個按鈕觸發事件達到自己的一個目的等
防范策略:
①csp (Content-Security-Policy)
②設置http響應頭 x-Frame-Options
X-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 <frame>, <iframe>或者 <object> 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去。
X-Frame-Options 有三個值:
deny :表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。
sameorigin :表示該頁面可以在相同域名頁面的 frame 中展示。
ALLOW-FROM uri :表示該頁面可以在指定來源的 frame 中展示。
換一句話說,如果設置為 deny,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。另一方面,如果設置為 sameorigin ,那么頁面就可以在同域名頁面的 frame 中嵌套。
③還可以使用window.self和window.top來判斷
window.self返回一個指向當前window的一個引用
window.top 返回窗口體系中最頂層窗口的引用
對於非同源的域名,iframe子頁面無法通過parent.location或者top.location拿到具體的頁面地址,但是可以寫入top.location,也就是可以控制父頁面的跳轉,所以當我們發現頁面被嵌入在iframe中時,可以重定向父級頁面:
if (window.self != window.top) { //正常頁面 top.location.href = self.location.href }
總體來說算是對安全有個了解了。