前端解决跨域总结(常用)

CSRF (cross site request forgery)跨站请求伪造

定义

又称XSRF,攻击者盗用用户身份,发送恶意请求。【冒充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)】

原理

用户登录受信任网站A,网站A下发cookies,在未关闭A网站页面情况下,访问B网站,网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A,于是,便带着网站A下发cookies完成请求
注:合法用户(C)、存在漏洞网站(A)、攻击网站(B)

用途&危害

以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等
个人隐私泄露以及财产安全受到威胁、网站信誉受到影响

防御

  • 通过 referer、token 或者 验证码 来检测用户提交。(验证refer(referer)(禁止来自第三方网站的请求))
  • 尽量不要在页面的链接中暴露用户隐私信息。
  • 对于用户修改删除等操作最好都使用post 操作 。
  • 避免全站通用的cookie,严格设置cookie的域。

xss (cross site scripting) 跨站脚本攻击

定义

攻击者可以利用 web应用的漏洞或缺陷之处,向页面注入恶意的程序或代码,以达到攻击的目的

原理

攻击者通过各种办法,在用户访问的网页中注入恶意脚本,让其在用户访问网页时在其浏览器中进行执行,从而达到恶意攻击用户的特殊目的

类型

  • 反射性XSS
    通过给用户发送带有恶意脚本代码参数的URL,当URL被打开时,特有的恶意代码被html解析,执行。
    特点是非持久化,必须用户点击特定参数的链接才能引起

  • 存储型XSS
    XSS代码提交给网站 -> 网站把XSS代码存储进数据库 -> 当该页面再次被访问时服务器发送已经被植入XSS代码的数据给客户端 -> 客户端执行XSS代码

  • 基于DOM的XSS
    DOM中的可被用户操纵的对象,如果DOM中的数据没有经过严格确认,就会产生漏洞XSS

用途&危害

身份盗用,钓鱼欺骗、垃圾信息发送

  • 盗取用户信息、隐私
  • 网站钓鱼,盗取各类用户的账号
  • 劫持用户会话,从而执行任意操作,例如进行非法转账,强制发表日志等
  • 强制弹出广告页面,刷流量
  • 流量劫持(通过访问某段具有 window.location.href 定位到其他页面)
  • dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。并且通过携带过程的 cookie信息可以使服务端返回400开头的状态码,从而拒绝合理的请求服务。

防御

对数据进行转义,针对富文本设置白名单,使用CSP

具体做法:

  • 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
  • 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
  • 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
  • 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
  • 后端接口也应该要做到关键字符过滤的问题。

XSS、CSRF两者区别

XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来攻击受信任的网站
XSS是服务器对用户输入的数据没有进行足够的过滤,导致客户端浏览器在渲染服务器返回的html页面时,出现了预期值之外的脚本语句被执行。
CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器

CORS

是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
最常用,主要是后端配置
实现此功能非常简单,只需由服务器发送一个响应标头即可。

如:php文件中 header('Access-control-allow-origin:*')
注:ajax xhr.open(method, url, async) async[true: 异步]

如果需要携带cookies发送请求跨域
后端需要在header 中添加

Access-Control-Allow-Credentials: true

前端在发送请求时也需要设置,假设使用的是XMLHttpRequest对象

xhr = new XMLHttpRequest();
xhr.withCredentials= true;  

ps:首发于我的segmentfault 前端解决跨域总结,以后可能会把博客/笔记迁入到segmentfault~~~

posted @ 2019-04-08 22:01  adash  阅读(728)  评论(0编辑  收藏  举报