我们页面常见的web安全问题有:
一、保证我们的前端页面没有漏洞可循
- xss跨站点脚本攻击: 不要新人任何用户的输入, 能跟用户产生交互的地方都需要对参数进行转译或者过滤
- 文件上传漏洞攻击: 校验文件格式, 后端限制存放文件路径的权限,限制运行脚本
- SQL注入攻击: 对用户输入进行转译, 后端采用预编译的sql,不要直接使用前端参数
- CSRF 跨站请求伪造
- anti CSRF token: 原理是从后端拿过来的html文件会在session存储一个随机的验证信息, 每次请求都发送这个验证信息进行校验
- 验证码登录: 这种的验证原理是确认操作的是人,而不是脚本,绝大部分验证码都不会被现有的脚本破解
- reffer 请求头验证,reffer会带原网站的访问信息
二、保证前后端传输不被盗取
采用https的验证方式, 那么为什么https的验证方式会那么安全?
- 对称加密: 公钥跟私钥是一样的, 都可以用来进行数据加密和解密, 攻击者只需要得到公钥,那么数据就像是未曾加密过一样,对称加密的问题是不会对每个用户生成一个秘钥。
- 非对称加密, 由服务器生成公钥私钥, 前端拿到公钥,对数据进行加密,私钥可以对数据进行解密。 非对称加密的问题是攻击者也可以得到公钥,所以可以拿到服务器返回的信息
- 对称加密 + 非对称加密: 这种方式的操作原理是,由客户端使用非对称加密的方式跟服务端商量出一个独一无二的key, 然后利用对称加密生成一个客户端独一无二的公钥。那么攻击者无法得到这个独一无二的公钥,便无法完成攻击。 但是这种方式仍然是有漏洞的,比如在客户端与服务端商量key的时候被中间人拦截, 问题是我们无法知道过来的请求是好的还是坏的
- 对称加密 + 非对称加密 + CA认证: 原理: 由CA部门颁发认证, 只有经过CA部门认证过的请求我们才认为是有效的请求。 具体的实现过程是
- 由CA部门提供算法来加密我们的公钥得到一个证书, 客户端请求到一个liscense,客户端得到liscense之后需要对其进行解密。
- 此时就需要CA部门提供的私钥来进行解密
- 为了防止从CA部门获取数字证书的过程中又被截获, 我们的操作系统中预先安装了数字证书, 即是我们用来解密的CA的私钥。
一、XSRF 攻击
想象一下,你登录了 bank.com
网站。此时:你有了来自该网站的身份验证 cookie。你的浏览器会在每次请求时将其发送到 bank.com
,以便识别你,并执行所有敏感的财务上的操作。
现在,在另外一个窗口中浏览网页时,你不小心访问了另一个网站 evil.com
。该网站具有向 bank.com
网站提交一个具有启动与黑客账户交易的字段的表单 <form action="https://bank.com/pay">
的 JavaScript 代码。
你每次访问 bank.com
时,浏览器都会发送 cookie,即使该表单是从 evil.com
提交过来的。因此,银行会识别你的身份,并执行真实的付款。
这就是“跨网站请求伪造(Cross-Site Request Forgery,简称 XSRF)”攻击。
当然,实际的银行会防止出现这种情况。所有由 bank.com
生成的表单都具有一个特殊的字段,即所谓的 “XSRF 保护 token”,恶意页面既不能生成,也不能从远程页面提取它(它可以在那里提交表单,但是无法获取数据)。并且,网站 bank.com
会对收到的每个表单都进行这种 token 的检查。
但是,实现这种防护需要花费时间:我们需要确保每个表单都具有 token 字段,并且还必须检查所有请求。
1、输入 cookie samesite 选项
Cookie 的 samesite
选项提供了另一种防止此类攻击的方式,(理论上)不需要要求 “XSRF 保护 token”。
它有两个可能的值:
samesite=strict
(和没有值的samesite
一样)
如果用户来自同一网站之外,那么设置了 samesite=strict
的 cookie 永远不会被发送。
换句话说,无论用户是通过邮件链接还是从 evil.com