Web 的安全防范,常见的几种攻击和防范措施

主要介绍和 XXS、SQL Injection、CSRF 等几种常见的 web 攻击,了解他们的原理,才能更加明白地防御他们。

Web 的安全防范,常见的几种攻击和防范措施

XSS (Cross-Site Scripting)

跨站脚本攻击,因为缩写和 CSS 重叠,所以只能叫 XSS 。跨站脚本攻击是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 Javascript 进行的一种攻击。

1. 造成的影响

  1. 利用虚假输入表单骗取用户个人信息
  2. 利用脚本窃取用户的 Cookie 值,被害人在不知道的情况下,帮助攻击者发送恶意请求
  3. 显示伪造的文章或图片

2. 非持久性的 XXS

1
2
3
4
5
#最直接的方式就是在 url 嵌入脚本代码

https://xxx.com/xxx?default=<script>alert(document.cookie)</script>

#一些浏览器如 Chrome 内置了一些 XSS 过滤器,可以防止大部分非持久化的 XSS 攻击
  • 尽量不要从 url、document.referrer、document.forms 等这种 Dom APi 中获取数据直接渲染
  • web 页面渲染的所有内容或者渲染的数据都必须保证来自服务端
  • 尽量不要使用 eval,document.write(),document.writeln(),window.setTimeOut()等可执行字符串的方法
  • 如果做不到以上几点,也必须对设计 DOM 渲染的方法传入的字符串进行 escape 转义
  • 前端渲染的时候对任何字段都需要做 escape 转义编码

3. 持久性的 XXS

典型的例子就是评论的时候,在 <textarea></textarea> 上插入<script></script> 脚本,
因为没转义保存到数据库,每个浏览评论的用户都会执行这端脚本。

4. 防范的措施

a) 设置白名单

1
2
3
4
5
6
7
8
9
10
#在 Header 增加上

# 只允许加载本站资源
Content-Security-Policy: default-src 'self'

#只允许加载 HTTPS 协议的图片
Content-Security-Policy: img-src https://*

#允许加载任何来源框架
Content-Security-Policy: child-src 'none'

b) 转义字符

1
2
3
4
5
6
7
8
9
function escape(str){
str = str.replace(/&/g,'&amp;');
str = str.replace(/</g,'&it;');
str = str.replace(/>/g,'&gt;');
str = str.replace(/"/g,'&quto;');
str = str.replace(/'/g,'&#39;');
str = str.replace(/`/g,'&#96;');
str = str.replace(/\//g,'&#x2F;');
}
1
2
3
4
#大多数 XXS 都是通过 js 来获取 Cookie 信息
#那么将改成
Cookie: HttpOnly
#就有效防止客户端切 js 窃取 cookie

CSRF (Cross Site Request Forgery)

CSRF (Cross Site Request Forgery),即跨站请求伪造,是一种常见的 Web 的攻击,他利用用户已登录的身份,在用户毫不知情的情况下,已用户的名义完成非法操作。

1. 原理

当我们进入了一个转账页面,突然出现一个广告弹窗,点进去然后进入了 B 网站,
点你点击的时候,使用 jS 脚本修改 form 的提交地址和账号,
那么你给别人转账了

2. 防范措施

  • Cookie 设置 SameSite属性,不允许跨域请求

  • referer 判断是从哪个网站传过来的,但是 httpshttp 的时候,因为安全问题,没有设置 referer

  • 使用 token

  • 在关键业务使用验证码,降低了用户体验,但是加强了安全。

Sql 注入

1. 跳过验证密码例子

1
2
3
4
5
6
7
8
9
10
11
12
#正常请求 http://127.0.0.1/inject.php?user=admin&pass=admin

# 那么后端代码写入
$user = $_GET['user']??'';
$pass = $_GET['pass']??'';
$sql = "select * from user where username='{$user}' and pwd='{pass}'";

# sql = "select * from user where username=admin and pwd = admin;"

# 如果请求的是 http://127.0.0.1/inject.php?user=admin&pass=admin%20or%201=1

# sql = "select * from user where username=admin and pwd = admin or 1=1;"

2. 通过 Union 来获取其他表的数据

1
2
3
4
5
6

# http://127.0.0.1/inject.php?user=admin&pass=admin' union select *,1 from path where '1=1

#实际上 sql = select * from user where username=admin and pwd = admin union select *,1 from path where 1=1;

#只要前半段查询的字段和后半段查询的语句的字段一样,那么就可以随意查询每个表的数据

3. 通过注释密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 首先做一个表单
<form action="./sql.php" method="post">
<p>
<label>
<input type="text" name="username">
</label>
</p>

<p>
<label>
<input type="password" name="password">
</label>
</p>
<input type="submit" value="submit">
</form>

# 后端

$sql = "select * from user where username = '{$user}' and psw = '{$pass}' ";

# sql = "select * from user where username= admin -- and psw = "

# -- 在 SQL 上是注释的意思,那么这样不同密码也能登录了

4. sql 注入的防范措施

  • 如果传入后端的是一些整数,如翻译,id 浏览文章,记得在后端处理,如 PHP 使用 intval()进行转换

  • 对于字符串变量,PHP 可以使用 addslashes() 函数转义,将 \’ \” \和空字符转为含有反斜杠溢出字符,或者使用 PDO 的参数绑定来提高安全性。

  • 转义或过滤一些特殊字符,如%。

  • 严格限制 Web 应用的数据库的操作权限,比如某些应用只能查询某个表,只能查询不能修改
  • 做好数据库备份

点击劫持

原理:点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 Iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点解

1.攻击示范

设置一个 iframe 然后将一个页面挡住,然后诱导用户点击。
当用户点击后,实际上是点击了订阅的按钮,从而间接性的骗取用户

2. 防御措施

  1. X-FRAME-OPTION 是一个响应头 : DENY 表示不允许通过 iframe 的方式展示;SAMEORIGIN表示可以在相同域名下通过 iframe 的方式演示;ALLOW-FROM表示页面可以在指定来源的 iframe 中展示。

  2. JavaScript 防御,使用 JavaScript 代码操作 dom 防止 iframe 显示。

URL 跳转漏洞

原理:黑客利用 URL 跳转漏洞来诱导安全意识比较低的用户点击,导致用户信息泄露或者资金的流失。

1. 攻击的示范

如:
http://gate.baidu.com/index?act=go&url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&url=http://t.cn/RVTatrd
http://tieba.baidu.com/f/user/passport?jumpUrl=http://t.cn/RVTatrd

2. 实现方式

Header 头跳转
JavaScript 跳转
META 标签跳转

1
2
3
4
//这里使用 PHP 模拟 Header 跳转
<?php
$url = $_GET['url']??'';
header("Location: $url")
1
2
<--! 下面使用 meta 跳转 -->
<meta http-equiv="refresh" content="0; url='http://www.qq.com/'">

3. 防范促使

  1. referer 限制 url 的来源,有缺点就是前面说的,https 跳 http 的时候因为安全问题为空

  2. 加入有效验证 token: 服务端生成用户不可控的 token 进行验证,即时用户自己生成恶意链接,也不会出现问题。

文章对你有用?给博主一个支持
0%