Web 安全是互聯網中不可或缺的一個領域,這個領域中誕生了大量的黑帽子與白帽子,他們都是安全領域的王者,在平時裏,他們利用各類巧妙的技術互相博弈,時不時就會掀起一場 Web 安全浪潮,真可謂神仙打架,各顯神通。php
本文從一個吃瓜羣衆的角度,聊一聊 Web 安全的一些有趣故事。css
在互聯網發展之初,IE 瀏覽器壟斷的時期,你們上網的目的都很單純,主要經過瀏覽器分享信息,獲取新聞。但隨着互聯網的不斷髮展發展,一個網頁能作的事情愈來愈多,除了看新聞,咱們還能夠看視頻、玩遊戲、購物、聊天等,這些功能都大大豐富了咱們的生活。前端
隨着網頁功能的逐漸增多,就開始出現了一些黑帽子,他們試圖經過一些技術手段來牟取利益。在我小的時候,印象最深的就是木馬病毒,它能夠監控你的鍵盤,將你在鍵盤上敲打的內容發送到黑客的機器上,黑客經過分析這些內容,很容易就能獲得你的遊戲帳號和密碼。web
在這以後,就誕生出了一些殺毒軟件,致力於解決網絡上的各類病毒,隨着不斷地發展,殺毒軟件已經成爲一臺電腦必不可少的軟件。正則表達式
爲何會出現這樣的安全問題?安全歸根究竟是信任的問題,若是全部人都按照正常的流程去上網,不去謀取私利,也就沒有安全問題可談了。算法
安全的根本在於信任,但要讓全部人互相信任談何容易。在當前階段,咱們能夠作到:持續作好安全防禦,讓漏洞愈來愈少,非法攻擊愈來愈困難,這樣就能逐漸減小黑帽子的數量,讓病毒製造者愈來愈少。sql
要作好安全,首先得理解安全問題的屬性,前人經過無數實踐,最後將安全的屬性總結爲安全三要素,分別爲:機密性、完整性、可用性。shell
機密性數據庫
完整性後端
可用性
有了安全 3 要素以後,咱們就能夠對安全問題進行評估了。
資產等級劃分
威脅分析
風險分析
確認解決方案
作好安全評估以後,咱們就有了一份安全解決方案,後續的安全工做只需按照這個方案去作,就沒有任何問題。
有了安全解決方案以後,咱們還能夠制定一些安全原則,遵照原則作事,可讓咱們事半功倍。
黑名單、白名單原則
最小權限原則
~
文件夾下的目錄,若是有人想刪庫跑路,在執行 rm -rf /
時,就會提示無權限。縱深防護原則
木桶理論
,安全水平每每取決於最短的那塊板。數據與代碼分離原則
不可預測性原則
有了這些安全原則,咱們就能夠開幹了,接下來介紹幾個常見的攻防案例。
安全攻防的案例很是多,這裏主要介紹幾個出鏡率比較高的安全問題。
XSS 攻擊的本質是將用戶數據當成了 HTML 代碼一部分來執行,從而混淆本來的語義,產生新的語義。
如圖所示,咱們註冊了一個 <script>alert(document.cookie)</script>
的用戶名,全部能看到此用戶名字的頁面,都會彈出當前瀏覽器的 Cookie,若是代碼的邏輯是將 Cookie 發送到攻擊者的網站,攻擊者就能冒充當前用戶進行登陸了。
XSS 攻擊方式有不少,全部和用戶交互的地方,都有可能存在 XSS 攻擊。
例如:
因爲頁面中與用戶交互的地方很是多,確定還有一些 XSS 的攻擊方式沒有被發現,而一旦被黑帽子發現,就可能形成嚴重的影響,因此咱們務必引發重視。
被 XSS 攻擊成功後,攻擊者就能夠獲取大量的用戶信息,例如:
識別用戶瀏覽過的網站。
獲取用戶真實的 IP。
盜取 Cookie
XSS 釣魚。
目前來講,XSS 已經獲得了互聯網行業的重視,許多開發框架都內置了安全的 HTML 渲染方法。
咱們也能夠自定義進行一些安全配置。
CSRF(Cross-site request forgery)跨站請求僞造,是一種利用用戶身份,執行一些用戶非本意的操做。
如圖所示:
試想一下,若是 C 冒充 A 進行了一次轉帳,一定會形成大量的經濟損失。
防護 CSRF 主要有如下幾種方式:
驗證碼
Referer 檢查
Token
點擊劫持是一種視覺欺騙的攻擊手段。攻擊者將須要攻擊的網站經過 iframe 嵌套的方式嵌入本身的網頁中,並將 iframe 設置爲透明,在頁面中透出一個按鈕誘導用戶點擊。
就像一張圖片上面鋪了一層透明的紙同樣,你看到的是攻擊者的頁面,可是其實這個頁面只是在底部,而你真正點擊的是被攻擊者透明化的另外一個網頁。
若是所示,當你點擊了頁面上的按鈕以後,本覺得會...... ,而真正執行的操做是關注了某人的博客。
因爲點擊劫持主要經過 iframe,因此在防護時,主要基於 iframe 去作。
方案一:frame busting
if (self !== top) { // 跳回原頁面 top.location = self.location;}
方案二:使用 HTTP 中的 x-frame-options 頭,控制 iframe 的加載,它有 3 個值可選:
配置 iframe 的 sandbox 屬性
服務器端的攻擊的方式也很是多,這裏列舉幾個常見的。
SQL 注入和 XSS 同樣,都是違背了數據和代碼分離原則致使的攻擊方式。
如圖所示,咱們利用 SQL 注入,就能在不須要密碼的狀況下,直接登陸管理員的帳號。
攻擊的前提是:後端只用了簡單的拼接 SQL 的方式去查詢數據。
# 拼接出來的 sql 以下:select * from user where username = 'admin' or 1=1 and password = 'xxx'# 不管密碼輸入什麼,這條 sql 語句都能查詢到管理員的信息
除此以外,SQL 注入還有如下幾種方式:
使用 SQL 探測,猜數據庫表名,列名。
select database as current if current[0]==='a',benchmark(10000,'猜對了')
若是代表猜對了,就延遲 10 s 並返回成功。使用存儲過程執行系統命令
字符串截斷
防止 SQL 注入的最好的辦法就是,不要手動拼接 SQL 語句。
最佳方案,使用預編譯語句綁定變量
在注入攻擊中,換行符注入也是很是常見的一種攻擊方式。
上傳文件是網頁開發中的一個常見功能,若是不加處理,很容易就會形成攻擊。
如圖所示,攻擊者上傳了一個木馬文件,而且經過返回的 URL 進行訪問,就能控制服務器。
一般咱們會控制上傳文件的後綴名,但也不能徹底解決問題,攻擊者還能夠經過如下方式進行攻擊:
僞造正常文件
Apache 解析方式是從後往前解析,直到找到一個認識的後綴名爲止
abc.php.rar.rar.rar
能繞事後綴名檢查,但在執行時,被當成一個 php 文件進行執行。IIS 會截斷分號進行解析
abc.asp;xx.png
能繞事後綴名檢查,但在執行時,被當成一個 asp 文件進行執行。HTTP PUT 方法容許將文件上傳到指定位置
PHP CGI 路徑問題
http://abc.com/test.png/xxx.php
時,會把 test.png 當作 php 文件去解析。防護文件上傳漏洞,能夠從如下幾點考慮:
判斷文件類型
使用隨機數改寫文件名和文件路徑
單獨設置文件服務器的域名
登陸認證攻擊能夠理解爲一種破解登陸的方法。攻擊者一般採用如下幾種方式進行破解:
彩虹表
Session Fixation 攻擊
Session 保持攻擊
多因素認證
除此以外,前端登陸認證還有多種方式,若是你對此感興趣,能夠參考我以前寫的 前端登陸,這一篇就夠了。
應用層拒絕服務攻擊,又叫 DDOS 攻擊,它指的是利用大量的請求形成資源過載,致使服務器不可用。
一般有如下幾種 DDOS 攻擊方式:
SYN Flood 洪水攻擊
Slowloris 攻擊
HTTP POST DOS
CC 攻擊
Server Limit DOS
ReDOS
對於應用層拒絕服務攻擊,目前也沒有特別完美的解決方案,不過咱們仍是能夠進行一些優化。
應用代碼作好性能優化
網絡架構上作好優化
限制請求頻率
其實,處理 DDOS 核心思路就是禁用不可信任的用戶,確保資源都是被正常的用戶所使用。
咱們在部署 web 應用的時候,常常會用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服務器,這些服務器自己也存在一些安全隱患,若是配置不當,很容易收到攻擊。
在配置 Web 服務器時,能夠參考如下幾點:
以用戶權限運行 Web 服務器
刪除可視化後臺
及時更新版本
本文介紹了 Web 安全的基本概念,以及大量的攻防技巧,其實這只是 Web 安全中的冰山一角,若是你對此感興趣,不妨在安全領域繼續深耕學習,必定能看到更廣闊一片天。
對於一個開發者來講,咱們應該在寫代碼時就將安全考慮其中,造成本身的一套安全開發體系,作到心中有安全,時時考慮安全,就能無形之中化解不法分子的攻擊。
最後,若是你對此有任何想法,歡迎留言評論!