Skip to content

Web开发之浏览器安全问题 #3

@lvisei

Description

@lvisei

Web开发之浏览器安全问题

XSS

概述

XSS(Cross Site Scripting)是跨站脚本攻击,为了区分CSS,所以缩写为XSS。XSS攻击方式是往Web页面插入恶意的 JavaScript 代码,当用户浏览网页的时候,插入的代码就是被执行,从而达到攻击的目的。

XSS 分为持久型与非持久型,区别是前者写入数据库,后者修改用户代码。

比如搜索的文本框,输入一些 JavaScript 代码,点击搜索,代码就会被执行,达到攻击的目的。

<script>alert(document.cookie)</script>

在文本框中输入以上代码,然后点击提交,就会把用户的cookie弹出来。

防范

  1. HttpOnly 浏览器禁止页面的Javascript访问带有HttpOnly属性的cookie。

  2. 只允许用户输入我们期望的数据。如消费金额框只能输入数字和小数点。

  3. 对数据进行加密处理。

  4. 输入检查(XSS Filter)

让一些基于特殊字符的攻击失效。常见的Web漏洞如XSS、SQLInjection等,都要求攻击者构造一些特殊字符。

CSRF

概述

CSRF(Cross-site request forgery)是跨站请求伪造。攻击者会虚构一个后端请求地址,诱导用户通过某些途径发送请求。通过伪装来自受信任用户,在受信任的网站进行请求,盗取信息。其实就是攻击者盗用了受害者的身份,以受害者的名义向网站发送恶意请求。

与XSS区别:XSS利用站点内的信任用户,CSRF是通过伪装来自受信任用户。

攻击的思想

CSRF攻击原理及防御
图片来自:CSRF攻击原理及防御

参考上图,可以总结,完成一次CSRF攻击,必须满足两个条件:

  1. 用户登录受信任网站A,并且在本地生成Cookie。

  2. 在不登出网站A的情况下,访问危险网站B。

防范

  1. 验证 HTTP Referer 字段, 验证请求的来源点

    利用HTTP头中的Referer判断请求来源是否合法,Referer首部包含了当前请求页面的来源页面的地址。

  2. 验证码

    CSRF攻击过程中,用户在不知情的情况下构造了网络请求,添加验证码后,强制用户必须与应用进行交互。

  3. 在请求地址中添加 token 并验证

    在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

  4. 利用cookie的 SameSite

    SameSite有3个值:Strict, Lax和None

  • Strict,浏览器会完全禁止第三方cookie。
  • Lax,相对宽松一些,在跨站点的情况下,从第三方站点链接打开和从第三方站点提交 Get方式的表单这两种方式都会携带Cookie。但如果在第三方站点中使用POST方法或者通过 img、Iframe等标签加载的URL,这些场景都不会携带Cookie。
  • None,任何情况下都会发送 Cookie数据。

XSRF

当网站同时存在XSS和CSRF漏洞时,XSS可以模拟客户端浏览器执行任意操作,在XSS攻击下,攻击者完全可以请求页面后,读取页面内容中的Token值,然后再构造出一个合法的请求。

ClickJacking

概述

点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

防范

X-Frame-Options HTTP响应头是用来给浏览器指示允许一个页面能否在<frame>、<iframe>、<object>中展现的标记。

有三个可选的值:

  1. DENY:浏览器会拒绝当前页面加载任何frame页面(即使是相同域名的页面也不允许)。
  2. SAMEORIGIN:允许加载frame页面,但是frame页面的地址只能为同源域名下的页面。
  3. ALLOW-FROM:可以加载指定来源的frame页面(可以定义frame页面的地址)。

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions