浏览器安全

内容安全策略(CSP)

一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。

不支持 CSP 的浏览器会忽略它,默认为网页内容使用标准的同源策略。

威胁

  • 跨站脚本攻击
  • 数据包嗅探攻击

使用

为使 CSP 可用,需要配置服务器返回头部字段:Content-Security-Policy(X-Content-Security-Policy 是旧版本写法),meta 标签也可配置

  • 响应头使用:Content-Security-Policy: <policy>
  • meta 标签使用:<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

响应头使用

参数 policy 是一个包含各种描述你的 CSP 策略指令的字符串,应当包含 default-src,default-src 允许指定多个源,当其他策略未指定的时候,将使用 default-src 指定的源

常见示例

  • 所有内容均来自站点的同一个源:Content-Security-Policy: default-src 'self';
  • 允许内容来自信任的域名及其子域名:Content-Security-Policy: default-src 'self' *.trusted.com;
  • 允许网页应用的用户在他们自己的内容中包含来自任何源的图片,但限制音视频需从特定源提供,所有脚本必须从特定主机服务器获取:Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src: userscripts.example.com;
  • 限制所有内容都要通过 SSL 方式获取:Content-Security-Policy: default-src https://onlinebanking.jumbobank.com;
  • 仅允许图片从任意地方加载:Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *;

报告模式

Content-Security-Policy-Report-Only: <policy>,此时 CSP 不是强制的,但任何违规行为将会报告给一个指定的 URI 地址

若普通模式与报告模式同时使用,则两者同时生效,首先查找普通模式的策略,然后再查找报告模式的策略

开启违规报告

默认情况不会发送违规报告,需要配置 report-uri 指定 uri 地址

Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi;

报告语法

JSON 对象

  • document-uri:发生违规的文档的 URI
  • referrer:违规发生处的文档引用
  • blocked-uri:被 CSP 阻止的资源 URI
  • violated-directive:违反的策略名称
  • original-policy:在 Content-Security-Policy 中指明的原始策略

同源策略

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

Domain:指定有效域 Path:指定有效 url Secure:只能在 ssl 和 https 的时候才会被发送到服务器 HttpOnly:限制 cookie 不能通过 js 访问

沙盒框架

iframe

csrf 跨站请求伪造

原理

攻击者构造网站后台某个功能接口的请求地址,通过非正常方法使得该地址自动加载

防范

  • 客户端:对于数据库的修改请求,全部使用 post 提交,表单提交时,携带一个随机验证字段,服务器验证该字段是否有效
  • 服务端:使用 token 验证、验证 HTTP Referer 字段
  • SameSite 参数,用于 Set-Cookie 响应头里面,有三种值:None、Strict、Lax(新版本浏览器默认值),用法:Set-Cookie: SameSite=Strict
    • strict:完全禁止第三方 cookie,跨站点时,任何情况下都不会发送 cookie
    • Lax:大多数情况下不发送 cookie,但是导航到目标网址的 get 请求除外
      • 链接:<a href="..."></a>
      • 预加载:<link rel="prerender" href="..."/>
      • get 表单:<form method="GET" action="...">

xss 跨站脚本攻击

原理

攻击者往网站里面插入攻击代码(输入框、URL 参数、POST 参数、Referrer、Cookie),当用户浏览该页面时,嵌入其中的 html 代码将会执行

分类

存储型

常见于带有用户保存数据的网站功能,如发帖、评论、私信等

  • 攻击者将恶意代码提交到目标网站的数据库中
  • 用户打开目标网站时,网站服务器将恶意代码从数据库中取出,拼接再 HTML 中返回给浏览器
  • 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作

反射型

常见于通过 URL 传递参数的功能,如搜索、跳转

  • 攻击者构造出特殊的 URL,其中包含恶意代码
  • 用户打开带有恶意代码的 URL 时,网站服务器将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器
  • 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作

DOM 型

DOM 型中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞

  • 攻击者构造出特殊的 URL,其中包含恶意代码
  • 用户打开带有恶意代码的 URL
  • 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作

防范

总体思路,对输入和 URL 参数进行过滤,对输出进行编码

  • 过滤输入
  • 转义 HTML
  • 纯前端渲染,代码与数据分离

其他通用防范

  • 设置响应头 Content-Security-Policy
  • 控制输入长度
  • HttpOnly,Set-Cookie: HttpOnly
  • 验证码
Last Updated:
Contributors: zhangfei