# XSS、CSRF、SQL注入
针对Web服务器的攻击,常见的有:XSS(跨站脚本攻击)
、CSRF(跨站请求伪造)
、SQL注入
# XSS(跨站脚本攻击)
攻击者 将恶意代码注入到网页 上,使得用户不经意地加载并执行。
# XSS类别
常见的有:反射性攻击、存储型攻击。
# 反射型攻击
恶意代码被嵌到 url参数。
1、 攻击者B 向 用户C 发送一个“改装过的url”
例如:
http://www.some.site/page.html?default=<script>alert(document.cookie)</script>
2、 网站A 从URL的参数
中取出恶意代码,并显示在屏幕上。
如:需要将一些错误信息、搜索结果直接显示在页面上时
# 存储型攻击
恶意代码被保存到 服务器。
1、 攻击者B 在 网站A 留下恶意评论;
2、 用户C 访问 网站A时,加载了 攻击者B 的评论
如:评论、博客、私信
# 防御手段
分别从 3 个方面:用户输入、Cookie凭证、资源加载。
# 用户输入
过滤
。对敏感参数直接进行过滤。(在提交表单、传递url参数之前)转义
。对用户输入的数据进行转义。1、
在React中使用JSX
。因为React DOM会使得所有内容在渲染前,都会被转换成字符串。2、常用转义规则
# Cookie凭证
httpOnly
:防止浏览器通过 document.cookie
读取 cookie。
# 资源加载
Content-Security-Policy
。让网站管理者去声明:在指定页面中,浏览器能够加载哪些资源。
Content-Type: application/json; charset=utf-8
1、避免输出内容被HTML解析
2、不使用:Content-Type: text/html; charset=utf-8
# 常用转义规则
以 “&” 开头,以 “;” 结尾
转义前 | 转义后 |
---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
/ | / |
# 恶意代码示例
<!-- 反射型:提前结束尾标签,拼接新标签 -->
><script>alert(document.cookie)</script>
<!-- 存储型:在 <img> 的 src 内置代码 -->
<img src="javascript:alert('XSS')" />
<!-- 存储型:在 <img> 的 onerror处 内置代码 -->
<img src="http://888.888.com/999.png" onerror="alert('XSS')" />
2
3
4
5
6
7
8
# CSRF(跨站请求伪造,Cross-Site Request Forgery)
攻击者通过欺骗用户的浏览器,以用户的名义去执行恶意操作。
由于浏览器的机制,当请求某个域名的接口时,会把关联的cookie(存在本地磁盘、且未过期)一起带过去。
# 攻击方式:
- 1、在用户成功登录
网站A
的情况下,攻击者诱导用户进入网站B
; - 2、在网站B中,攻击者的脚本“偷偷”向
网站A
发请求;
结果:网站A认为是用户本人发出,接受请求。
# 防御手段:
分别从 跨站、csrfToken 进行防御。
# 跨站
# 检查请求的Referer字段
Referer
可以表示请求来源于哪个地址,所以可以用来判断请求是否从本站发出。
缺点:要正确判断
是否为合法请求源
不容易
# 检查Cookie的SameSite属性
使用Cookie的SameSite属性(表明跨站点时能否访问该cookie)
2019年,Google提出的新cookie标准,为防止CSRF提供了第一道防线
# Token
# 设置Token并验证
Token + cookie + 校验“请求体“与“请求头cookie”
原因:攻击者只能利用,但并不能获取用户的cookie
- 用户请求登录接口
- 服务端收到请求,生成随机的Token,并通过响应头
Set-Cookie
下发 - 网站A 解析
cookie
,把Token
放到请求体(或请求头的自定义属性),和其它参数一起提交请求 - 服务端检查 cookie里的Token 与请求体(或请求头的自定义属性)中的Token是否一致
# 使用图片验证码
# SQL注入
攻击者 把SQL命令 通过表单输入框提交,以 欺骗 服务器执行恶意的SQL命令。
# 防止手段
对用户的输入进行检查、过滤。