# XSS、CSRF、SQL注入

针对Web服务器的攻击,常见的有:XSS(跨站脚本攻击)CSRF(跨站请求伪造)SQL注入

# XSS(跨站脚本攻击)

攻击者 将恶意代码注入到网页 上,使得用户不经意地加载并执行。

攻击者也可以事先架设好一个网站,让受害者通过恶意脚本,把自己的私密数据(如:cookie)作为参数提交出去。

# XSS类别

一共有3种:反射性攻击存储型攻击DOM-Based攻击

官方网站(A)、攻击者(B)

# 反射型攻击

恶意代码被不经意加载到浏览器上。

1、 B向用户发送一个url

2、 A网站从URL的参数中取出恶意代码,并返回到浏览器上。

如:需要将一些错误信息、搜索结果直接显示在页面上时

# 存储型攻击

恶意代码被永久地保存到Web服务器。

1、 B在A网站留下恶意评论;

2、 C访问A网站,加载了B的评论

如:评论、博客、私信

# DOM-Based型攻击

利用原生JS代码篡改客户端的DOM结构,导致用户执行了意外的动作。

<!-- 下面是某网站的代码,它的Select是由document.write的方式去实现的 -->
Select your language:
<select>
    <script>
        document.write("<OPTION value=1>" + document.location.href.substring(document.location.href.indexOf("default=")+8) + "</OPTION>");

        document.write("<OPTION value=2>English</OPTION>");
    </script>
</select>
1
2
3
4
5
6
7
8
9

通常访问时:

http://www.some.site/page.html?default=French
1

黑客修改后:

http://www.some.site/page.html?default=<script>alert(document.cookie)</script>
1

# 防御手段:

用户输入的处理:

  • 过滤。对敏感参数直接进行过滤。(在提交表单、传递url参数之前)
  • 转义。对用户输入的数据进行转义。

    1、在React中使用JSX。因为React DOM会使得所有内容在渲染前,都会被转换成字符串

    2、常用转义规则

cookie的保护:

  • httpOnly。对于cookie设置为httpOnly

    防止客户端通过document.cookie读取cookie

HTTP头的处理:

  • Content-Type: application/json; charset=utf-8

    1、避免输出内容被HTML解析

    2、不使用:Content-Type: text/html; charset=utf-8

  • Content-Security-Policy

    允许网站管理者去声明:在指定页面中,浏览器能够加载哪些资源

# 常用转义规则

& --> &amp;
< --> &lt;
> --> &rt;
" --> &quot;
' --> &#x27;
/ --> &#x2F;
1
2
3
4
5
6

# 恶意代码示例

  • ><script>alert(document.cookie)</script>
  • <img src="javascript:alert('XSS')" />
  • <img src="http://888.888.com/999.png" onerror="alert('XSS')" />

# CSRF(跨站请求伪造,Cross-Site Request Forgery)

攻击者通过欺骗用户的浏览器以用户的名义去执行恶意操作。

由于浏览器的机制,当请求某个域名的接口时,会把关联的cookie(存在本地磁盘、且未过期)一起带过去。

# 攻击方式:

  • 1、在用户成功登录网站A的情况下,攻击者诱导用户进入网站B
  • 2、在网站B中,攻击者的脚本“偷偷”向网站A发请求;

结果:网站A认为是用户本人发出,接受请求。

# 防御手段:

CSRF的两个特点:利用 cookie 自动携带的特性以及跨站

检查Referer字段:

该字段可以表示请求来源于哪个地址,所以可以用来判断请求是否从本站发出

缺点:要正确判断是否为合法请求源不容易

设置Token并验证:

原因:攻击者只能利用,但并不能获取用户的cookie

  • 方法一:Token + cookie + 校验“请求体“与“请求头cookie”

    1、服务端在响应头设置Set-Cookie(值是随机生成Token

    2、浏览器在收到响应头后,会把cookie种到浏览器

    3、浏览器解析cookie,把Token放到请求体(或请求头的自定义属性),和其它参数一同提交请求。

    4、服务端检查cookie里的Token请求体(或请求头的自定义属性)中的Token是否一致

  • 方法二:sessionId + cookie + 校验“请求体“与“请求头cookie”

    1、和“方法一”类似,服务端根据sessionId生成一份Token,仅通过cookie返回sessionId

    2、浏览器解析cookie,把sessionId放到请求体(或请求头的自定义属性),和其它参数一同提交请求。

    3、服务端会根据请求体(或请求头的自定义属性)中的sessionId去校对身份

使用图片验证码

使用Cookie的SameSite属性(表明跨站点时能否访问该cookie)

2019年,Google提出的新cookie标准,为防止CSRF提供了第一道防线

# SQL注入

攻击者通过把SQL命令插入到表单的输入框,来欺骗 服务器 执行恶意的SQL命令

# 防止手段

对用户的输入进行检查、过滤

更新时间: 10/30/2020, 4:44:59 PM