[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 请求,使正常的用户无法完成通信。
:-: ![](https://img.kancloud.cn/d2/f6/d2f6b204ce5502b3da68e211bc630588_558x505.png)
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