[TOC]
## **跨站請求偽造 (CSRF)**
**CSRF(Cross-site request forgery,跨站請求偽造)**
CSRF(XSRF) 顧名思義,它是一種挾制用戶在當前已登錄的 Web 應用程序上執行非本意的操作的攻擊方法。CSRF 利用的是網站對用戶網頁瀏覽器的信任。
攻擊者盜用了你的身份,以你的名義發送惡意請求。
### 示例
假如一家銀行用以執行轉賬操作的URL地址如下: `https://bank.example.com/withdraw?account=AccoutName&amount=1000&for=PayeeName`
那么,一個惡意攻擊者可以在另一個網站上放置如下代碼:` <img src="https://bank.example.com/withdraw?account=Alice&amount=1000&for=Badman" />`
如果有賬戶名為Alice的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那么她就會損失1000資金。
### 防范方法
* 關鍵操作**只接受POST請求**
* **驗證碼** - 請求提交時,需要用戶輸入驗證碼,以避免用戶在不知情的情況下被攻擊者偽造請求。
* **表單 Token** - CSRF 是一個偽造用戶請求的操作,所以需要構造用戶請求的所有參數才可以。表單 Token 通過在請求參數中添加隨機數的辦法來阻止攻擊者獲得所有請求參數。
* **檢測 Referer** - HTTP 請求頭的 Referer 域中記錄著請求資源,可通過檢查請求來源,驗證其是否合法
## **跨站腳本攻擊(XSS)**
XSS(Cross-Site Scripting),是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊**通常包含了 HTML 以及用戶端腳本語言**。
XSS 是實現 CSRF 的諸多途徑中的一條,但絕對不是唯一的一條。一般習慣上把通過 XSS 來實現的 CSRF 稱為 XSRF。
### 示例
假如有下面一個` textbox`
~~~html
<input type="text" name="address" value="value1from">
~~~
`value1from` 是來自用戶的輸入,如果用戶不是輸入 `value1from`,而是輸入
`"/><script>alert(document.cookie)</script><!-` 那么就會變成:
~~~html
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">
~~~
嵌入的 JavaScript 代碼將會被執行。攻擊的威力,取決于用戶輸入了什么樣的腳本。
### 防范方法
* **過濾特殊字符** - 將用戶所提供的內容進行過濾,從而避免 HTML 和 Jascript 代碼的運行。
如?`>`?轉義為?`>`、`<`?轉義為?`<`?等,就可以防止大部分攻擊。為了避免對不必要的內容錯誤轉移,如?`3<5`?中的?`<`?需要進行文本匹配后再轉移,如:`<img src=`?這樣的上下文中的?`<`?才轉義。.
* **設置 Cookie 為 HttpOnly** - 設置了 HttpOnly 的 Cookie 可以防止 JavaScript 腳本調用,就無法通過 document.cookie 獲取用戶 Cookie 信息。
## **SQL 注入攻擊**
SQL 注入攻擊(SQL injection),是發生于應用程序之數據層的安全漏洞。簡而言之,就是**通過把 SQL 命令偽裝成正常的請求參數,傳遞到服務端,欺騙服務器最終執行惡意的 SQL 命令,達到入侵的目的**。攻擊者常常利用**SQL**注入的漏洞,來查詢非授權的關鍵信息,修改數據庫服務器的數據,改變表結構,危害極大!
### 示例
我們查詢用戶存不存在往往是通過以下 SQL:
~~~
SELECT * FROM s_user WHERE username = '' and password = ''
~~~
當我們后端使用以下代碼查詢時,便會出現致命的漏洞
~~~php
$conn = new mysqli('127.0.0.1:3306', 'root', '123456');
$sql = "SELECT * FROM s_user WHERE username = '"+ $username +"' and
$res = $conn->query($sql);
~~~
上面代碼邏輯便是利用前端傳入的參數進行數據庫查詢,乍看之下感覺毫無問題,但是這個時候如果`password`前端傳過來的值是`' or '1'='1`。
那這個時候 SQL 就會變成
~~~text
SELECT * FROM s_user WHERE username = '' and password = '' or '1'='1'
~~~
`' or '1'='1`危害是讓用戶免密碼登錄,如果傳過來的值為`'; drop table xxx; --`這個時候問題就大了!
### 防范方法
* 使用參數化查詢 - 建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到 SQL 語句中,即不要直接拼接 SQL 語句。
## **拒絕服務攻擊(DOS)**
拒絕服務攻擊(denial-of-service attack, DoS)亦稱洪水攻擊,是一種網絡攻擊手法,**其目的在于使目標電腦的網絡或系統資源耗盡,使服務暫時中斷或停止,導致其正常用戶無法訪問。**
攻擊者借助公共網絡,將數量龐大的計算機設備聯合起來作為攻擊平臺,對一個或多個目標發動攻擊,從而達到癱瘓目標主機的目的。通常在攻擊開始之前,攻擊者會提前控制大量的用戶計算機,這類計算機稱之為`肉雞`,并通過指令使大量的的肉雞在同一時刻對某個主機進行訪問,從而達到癱瘓目標主機的目的。稱為**分布式拒絕服務攻擊(distributed denial-of-service attack,縮寫:DDoS attack、DDoS)**。
### DDoS分類
1. **SYN Flood**
SYN Flood 是互聯網中最經典的攻擊方式之一。利用了 **TCP 協議三次握手**的過程來達到攻擊的目的。攻擊者**偽造大量的 IP 地址**給服務器發送 **SYN **報文,因為偽造的 IP 地址不可能存在,也就不可能從客戶端得到任何響應,就一直 **卡在服務器等待接收客戶端 **ACK** 那一步**,服務端就得維護一個非常大的半連接等待列表,并且不斷對這個列表中的 IP 地址進行遍歷重試,占用了大量的系統資源。而由于服務器資源有限,惡意的連接占滿了服務器的等待隊列,導致服務器不再接收新的 SYN 請求,使正常的用戶無法完成通信。
:-: 
2. **DNS Query Flood**
**DNS Query Flood**實際上就是**UDP Flood**攻擊的一種變形,因為**DNS**服務在互聯網中具有不可替代的作用,因此一旦**DNS 服務器**癱瘓,影響將非常大!
**DNS Query Flood**攻擊采用的方法是**向被攻擊的服務器發送海量的域名解析請求**。而這部分請求解析的域名一般都是隨機生成的,大部分不存在,并且通過偽造端口和客戶端IP,防止查詢請求被**ACL**(訪問控制列表)過濾。被攻擊的**DNS服務器**在收到域名解析的請求后,首先會在自己的服務器上查找是否該域名的 IP,因為域名的不存在,在自身自然是找不到的,因此**DNS 服務器**便會向上層的 DNS服務器遞歸查詢域名,直到全球互聯網的 13臺 根DNS服務器。大量不存在的域名解析請求給服務器帶來了很大的負載,當解析請求超過一定量級的時候,就會造成**DNS服務器**解析域名超時,使正常的域名都查詢不到對應的 IP,達到了攻擊的效果。
3. **CC 攻擊**
**CC**(Challenge Collapsar)攻擊是基于應用層 HTTP 協議發起的攻擊,也稱為**HTTP Flood**
**CC攻擊**的原理是通過控制大量的**“肉雞”**或者利用從互聯網上搜尋的大量匿名的 HTTP 代理,**模擬正常用戶給網站發起請求直到該網站拒絕服務為止。**大部分網站會通過**CDN**以及分布式緩存來加快服務端的響應,提高網站的吞吐量。而這些惡意的 HTTP 請求會有意的避開這些緩存,需要進行多次 DB 查詢操作或者一次請求會返回大量的數據,加速系統資源的消耗,從而拖垮后端的業務處理系統。
### 防范方法
通常可以采購云廠商的安全服務,比如DDoS高防IP,可以把攻擊流量都導入到云廠商的高防IP的服務器上去,他們有專業的技術方案和算法來防御。
針對CC攻擊,網關可以用redis做個IP限流。對于惡意IP禁止訪問。
*
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS