XSS和CSRF

CSRF

CSRF(Cross-Site-Request-Forgery):跨站请求伪造,简单点说就是 攻击者伪造成你的身份去发送请求,执行某些破坏性的操作

例如:某个银行有的转账链接:https://www.bankA.com/transfer?username=xiaoxia&account=1000;表示向xiaoxia转账1000元;
攻击者拿到这个链接后,就将该链接嵌入到引诱用户点击的页面A中,当用户登录了该银行账户,并且登录信息尚未失效的情况下,用户点击了页面A,那么就会往xiaoxia这个用户转账1000元;这样攻击者就达到了伪造成用户去发送请求,并对用户造成经济损失的效果;

防范方法:

  1. 对于隐秘数据的方法都是用POST请求;
  2. 验证referer,referer存放的是发送该请求的来源网址,在服务器端中检查referer是否与请求域名相同,因为CSRF攻击,往往会引诱你点击外链,这样referer就与请求域名不同了
  3. 验证token,例如当用户访问转账的网页时,服务器接收到该请求后,生成一个随机数,并将该随机数插入到表单中,并将表单页面返回给用户,当用户提交转账信息时,会将随机数一并提交,服务器就验证该随机数是否与之前给用户生成的随机数相同,如果相同则请求有效,否则无效;因为CSRF攻击基本上都是直接发送达成某个损害效果的url,因此也就无法获取服务器生成的随机数,这时随机数为空,请求失败;过程如下:
    • 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内,
    • 服务端设置setCookie,把该随机数作为cookie或者session种入用户浏览器
    • 当用户发送 GET 或者 POST 请求时带上_csrf_token参数(对于 Form 表单直接提交即可,因为会自动把当前表单内所有的 input 提交给后台,包括_csrf_token)
    • 后台在接受到请求后解析请求的cookie获取_csrf_token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求是合法的。

XSS

Cross-Site-Script:跨站脚本攻击;攻击者利用网站的漏洞,注入有害的脚本代码,当用户访问网站时,脚本自动运行,攻击者可以利用这些脚本获取cookie,session token等信息;

产生原因:

  1. 后台模板问题;例如一个评论系统,攻击者在评论中插入恶意的脚本代码,后台直接将该包含恶意代码的脚本原样输出到客户端执行;
  2. 前端代码问题;前端直接使用用户输入的信息拼接成html,使得恶意代码直接插入到网页中执行;

防范:

  1. 后台对用户提交可疑符号,转换为HTML实体,如:< 或 >
  2. 尽量不要在前台拼接html,如果一定要拼接,要把可以的符号,转换为HTML实体,如< 或 >,转换为<>

参考

  • XSS攻击
  • CSRF维基
    CSRF介绍

你可能感兴趣的:(XSS和CSRF)