daily-plan icon indicating copy to clipboard operation
daily-plan copied to clipboard

2020-05-12 前端安全专栏

Open sl1673495 opened this issue 4 years ago • 2 comments

XSS 攻击的类型

http://blog.poetries.top/browser-working-principle/guide/part6/lesson34.html

XSS 全称是 Cross Site Scripting,为了与“CSS”区分开来,故简称 XSS,翻译过来就是“跨站脚本”。

存储型 XSS 攻击

首先黑客利用站点漏洞将一段恶意 JavaScript 代码提交到网站的数据库中;然后用户向网 站请求包含了恶意 JavaScript 脚本的页面;当用户浏览该页面的时候,恶意脚本就会将用 户的 Cookie 信息等数据上传到服务器。

反射型 XSS 攻击

黑客可能会把一段脚本藏在 url 中诱骗用户打开,然后服务端利用 url 中的一些信息又回 填到页面中了,此时用户的页面就被注入了这个 script 脚本。

基于 DOM 的 XSS 攻击

比如通过网络劫持在页面传输过程中修改 HTML 页面的内容,有通过 WiFi 路由器劫持的, 有通过本地恶意软件来劫持的。

如何阻止 XSS 攻击

服务器对输入脚本进行过滤或转码

code:<script>alert(' 你被 xss 攻击了 ')</script>

充分利用 CSP

  1. 限制加载其他域下的资源文件
  2. 禁止向第三方域提交数据
  3. 禁止执行内联脚本和未授权的脚本
  4. 上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击
Content-Security-Policy: script-src 'self' https://apis.google.com

image

CSP 策略不仅仅局限于针对脚本,还可以针对比如 iframe、img、media 来源等各种限制。

使用 HttpOnly 属性

XSS 很多时候是用来窃取 cookie 的,只要 cookie 加上了 HttpOnly 属性,就无法在客户 端脚本中访问它了。

sl1673495 avatar May 13 '20 03:05 sl1673495

CSRF

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”。是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事

1. 自动发起 GET 请求

image

黑客将转账的请求接口隐藏在 img 标签内,欺骗浏览器这是一张图片资源。当该页面被加载时,浏览器会自动发起 img 的资源请求,如果服务器没有对该请求做判断的话,那么服务器就会认为该请求是一个转账请求,于是用户账户上的 100 极客币就被转移到黑客的账户上去了。

2. 自动发起 POST 请求

image

在这段代码中,我们可以看到黑客在他的页面中构建了一个隐藏的表单,该表单的内容就是极客时间的转账接口。当用户打开该站点之后,这个表单会被自动执行提交;当表单被提交之后,服务器就会执行转账操作。因此使用构建自动提交表单这种方式,就可以自动实现跨站点 POST 数据提交。

3. 引诱用户点击链接

除了自动发起 Get 和 Post 请求之外,还有一种方式是诱惑用户点击黑客站点上的链接,这种方式通常出现在论坛或者恶意邮件上。黑客会采用很多方式去诱惑用户点击链接,示例代码如下所示:

image

如何防止 CSRF 攻击

  1. 充分利用好 Cookie 的 SameSite 属性,可以按需设置成 Strict、Lax

    • Strict 禁止一切跨站 Cookie 的发送。
    • Lax 在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交 Get 方式的表单这两种方式都会携带 Cookie。但如果在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie。
  2. 验证请求的来源站点 Referer 是 HTTP 请求头中的一个字段,记录了该 HTTP 请求的来源地址。 Origin 属性只包含了域名信息,是有些站点因为安全考虑,不想把源站点的详细路径暴露给服务器。

服务器的策略是优先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际情况判断是否使用 Referer 值。

  1. CSRF Token 第一步,在浏览器向服务器发起请求时,服务器生成一个 CSRF Token。CSRF Token 其实就是服务器生成的字符串,然后将该字符串植入到返回的页面中。你可以参考下面示例代码: 第二步,在浏览器端如果要发起转账的请求,那么需要带上页面中的 CSRF Token,然后服务器会验证该 Token 是否合法。如果是从第三方站点发出的请求,那么将无法获取到 CSRF Token 的值,所以即使发出了请求,服务器也会因为 CSRF Token 不正确而拒绝请求。

sl1673495 avatar May 14 '20 08:05 sl1673495

谷歌的安全专栏笔记

https://developers.google.com/web/fundamentals/security

关键字:

  1. HTTPS 对传输中的数据进行加密
  2. CSP 内容安全政策
  3. 防止混合内容

内容安全政策 CSP

TL;DR

  1. 使用白名单告诉客户端允许加载和不允许加载的内容。
  2. 了解可使用哪些指令。
  3. 了解这些指令接受哪些关键字。
  4. 内联代码和 eval() 被视为是有害的。
  5. 向服务器举报政策违规行为,以免执行这些行为

来源白名单

Content-Security-Policy: script-src 'self' https://apis.google.com

script-src 是一条指令,其用于控制脚本对于某个特定页面所享有的一组权限。 我们已指定 'self' 作为一个有效的脚本来源,指定 https://apis.google.com 作为另一个有效的脚本来源。

当然,不止可以阻止脚本。CSP 提供了一组丰富的指令集,可以阻止 iframeformfontimgmediastyle等等。 还可以指定 report-uri 于指定在违反内容安全政策时浏览器向其发送报告。

禁止内联标签

script-src 或者 style-src 指令中添加 'unsafe-inline' 可以拒绝内联标签的执行。CSP 的白名单是需要基于域名来源的,且内联脚本也不利于「浏览器缓存」和「结构与行为分离」。

报告

您可以指示浏览器将 JSON 格式的违规行为报告 POST 到在 report-uri 指令中指定的位置。

Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

仅报告

可以渐进式的为应用接入 CSP 策略,先采取仅报告而不拦截的策略去评估。

Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

其他

  1. 开启HTTPS
  2. 禁止混合内容

sl1673495 avatar May 15 '20 02:05 sl1673495