CSRF和XSS
CSRF
- CSRF (Cross Site Request Forgery)攻击,中文名:跨站请求伪造。
- 攻击原理:攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。用户在登录状态下这个请求被服务端接收后会被误以为是用户合法的操作。对于 GET 形式的接口地址可轻易被攻击,对于 POST 形式的接口地址也不是百分百安全,攻击者可诱导用户进入带 Form 表单可用POST方式提交参数的页面。
- 防御措施:
- Token验证
- 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内,
<input type="hidden" name="_csrf_token" value="xxxx">
) - Token放在Session中。
- 当用户发送 GET 或者 POST 请求时带上_csrf_token参数(对于 Form 表单直接提交即可,因为会自动把当前表单内所有的 input 提交给后台,包括_csrf_token)
- 后台在接受到请求后解析请求的cookie获取_csrf_token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求是合法的。
- 客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
- 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内,
- Referer验证
- http头中有一个referer,记录http请求的来源地址,访问一个安全受限的页面的请求必须来自同一个网站。当用户要提交一个请求时,请求的referer值需是提交按钮(触发请求)所在的页面的URL。
- 隐藏令牌
- 请求头部添加token。在使用xhr请求的时候,可以添加一个自定义头部,里面包含token的数据。缺点:如果原系统并不是xhr请求的话,修改工作量非常巨大。
- Token验证
XSS
- XSS(Cross Site Scripting)攻击,中文名:跨站脚本攻击。
- 攻击原理:XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
- 防御措施:
- 对特殊字符进行编码(对用户输入的数据进行HTML Entity编码)。不能对用户的所有输入保持原样,对特殊字符要进行HTML Entity编码。
- 过滤用户输入的内容(特别重要)。原样显示内容的时候要过滤,把不合法的东西统统过滤掉,从而保证安全性。
- 使用cookie的httpOnly属性,加上了这个属性的cookie字段,js是无法进行读写的。带有httpOnly的cookie用document.cookie是获取不到的。