keyclaok~web安全防护

安全配置Security Defenses

通过对Security Defenses的配置 ,可以对http头添加相应的安全配置 ,如CSP, X-Frame-Options,  X-Content-Type-Option等

1 X-Frame-Options

推荐使用CSP,不建议使用X-Frame-Options头

参考:https://www.rfc-editor.org/rfc/rfc7034

  • 它对于html页面不起作用,响应头里无这个信息,X-Frame-Options SAMEORIGIN,其中SAMEORIGIN表示同源(同域名),a.shop.com和www.shop.com不是同一域名

你的网站添加了X-Frame-Options之后,保存了自己的网站不被其它网站引用,比如其它网站想iframe你的网站,通过X-Frame-Options DENY之后,其它网站是不容许iframe你的网站的。

HTTP 响应头是用来给浏览器指示允许一个页面可否在 , 或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。

现代浏览器遵循 X-Frame-Options 协议头,它表明一个资源是否允许加载到 frame 或者 iframe 中。 如果响应包含值为 SAMEORIGIN 的协议头,浏览器会在 frame 中只加载同源请求的的资源;如果协议头设置为 ,浏览器会在加载 frame 时屏蔽所有资源,无论请求来自于哪个站点;如果希望开放给某个域名,可以使用ALLOW-FROM uri来实现它,DENY表示拒绝所有请求。

如果在kc中配置了它,并且在其它网站想通过iframe嵌入KC的页面,那么,如果使用SAMEORIGIN
它会出现如下图提示;如果是同源网站,是可以通过iframe访问它的

# 不允许被嵌入,包括<frame>, <iframe>, <embed> 和 <object>
X-Frame-Options: deny

# 只允许被同源的页面嵌入
X-Frame-Options: sameorigin

# (已废弃)只允许被白名单内的页面嵌入,很多浏览器已不在支持,推荐直接CSP
X-Frame-Options:ALLOW_FROM www.example.com

#只容许被baidu.com这个域名和它的所有子域名和不同端口等嵌套本网站,例如a.baidu.com,b.baidu.com:8081等
X-Frame-Options:ALLOW_FROM baidu.com 

2 Content Security Policy

参考:https://www.w3.org/TR/CSP/

你的网站需要引用外部资源,如你需要引用微信的js脚本,或者需要iframe微信的页面,这时,你需要配置自己网站的CSP,将微信添加到白名单即可,例如:frame-src 'self' https://www.recaptcha.net https://open.weixin.qq.com
"网页安全政策"(Content Security Policy,缩写 CSP)CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

# keycloak`不去嵌套其它网络`的资源
Content-Security-Policy: frame-src 'self'

# keycloak`不允许被其它网站`嵌入,包括<frame>, <iframe>, <object>, <embed> 和 <applet>
Content-Security-Policy: frame-ancestors 'none'

# 只允许被同源的页面嵌入
Content-Security-Policy: frame-ancestors 'self'

# 只允许被白名单的网站嵌入
Content-Security-Policy: frame-ancestors www.example.com

**注意:由于keycloak对接的微信扫码功能,采用了iframe的方式嵌入微信的二维码页面,所以这块我们不能配置,不然微信不能使用,或者使用Content-Security-Policy: frame-src open.weixin.qq.com

CSP中的unsafe-inline和unsafe-eval

在CSP(内容安全策略)的script-src指令中添加 'unsafe-inline''unsafe-eval' 的作用是允许页面使用内联脚本和使用 eval() 函数执行动态脚本。

具体解释如下:

  1. 'unsafe-inline':允许页面使用内联脚本。内联脚本是直接嵌入在 HTML 中的 JavaScript 代码,例如 <script>alert('Hello, World!');</script>。默认情况下,CSP 不允许使用内联脚本,因为它们增加了跨站脚本攻击(XSS)的风险。然而,在某些情况下,可能需要允许内联脚本来实现特定的功能或与旧代码兼容。

  2. 'unsafe-eval':允许页面使用 eval() 函数执行动态脚本。eval() 函数可以将字符串作为 JavaScript 代码进行解析和执行。默认情况下,CSP 不允许使用 eval() 函数,因为它存在安全风险,可能导致代码注入攻击或者不安全的代码执行。然而,某些应用程序或库可能需要使用 eval() 函数来实现动态脚本加载或其他特定功能。

需要注意的是,添加 'unsafe-inline''unsafe-eval' 可能会降低网页的安全性,因为它们打开了潜在的漏洞。在实际使用中,应该尽量避免使用这两个选项,并优先考虑使用更安全的替代方法,如外部脚本文件和更严格的代码验证。只有在确保没有其他可行的解决方案,并且确保内联脚本和 eval() 的使用是安全的情况下,才应该考虑添加这两个选项。

3 Content-Security-Policy-Report-Only

参考:https://www.w3.org/TR/CSP/

与Content Security Policy的配置相同,但它不做限制,只是做为记录

4 X-Content-Type-Options

参考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Content-Type-Options

如果服务器发送响应头 "X-Content-Type-Options: nosniff",则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。

5 X-Robots-Tag

参考:https://http.dev/x-robots-tag

机器人元标签,Robots 元标记,也称为robots 标记,是一段 HTML 代码,位于网页的 部分,用于控制搜索引擎如何抓取和索引 URL。

机器人元标签有什么用?

机器人元标记用于控制 Google 如何为您的网页内容编制索引。这包括:

  • 是否在搜索结果中包含页面
  • 是否遵循页面上的链接(即使它被阻止被索引)
  • 请求不索引页面上的图像
  • 请求不在 SERP 上显示网页的缓存结果
  • 请求不在 SERP 上显示页面的片段(元描述)

常见的搜索引擎

6 X-XSS-Protection

参考:https://owasp.org/www-project-secure-headers/#xxxsp

  • 这是 HTTP 的一个响应头字段,要开启很简单,在服务器的响应报文里加上这个字段即可。浏览器接收到这个字段则会启用对应的 XSS 防范模块。
  • IE、Chrome 和 Safari 都内置了这个模块。edge 和火狐没有内置这个模块。
  • 开启这个功能后,当浏览器检测到跨站脚本攻击(XSS)时,浏览器将对页面做清理或直接阻止整个页面的加载。

配置列表

  • X-XSS-Protection : 0 表示禁用 XSS 过滤这个功能
  • X-XSS-Protection : 1 表示启用 XSS 过滤
  • X-XSS-Protection : 1;mode=block 表示启用XSS过滤器
  • X-XSS-Protection : 1;report= 表示启用 XSS 过滤,并使用report-uri的功能 POST 一个 XSS 警报。这个功能只有在 Chrome 中有效果,在 IE 中无效

7 HTTP Strict Transport Security (HSTS)

参考:https://owasp.org/www-project-secure-headers/#hsts

HSTS是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。

  • 配置举例:
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    • 在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。
    • 在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

posted @ 2023-03-21 18:34  张占岭  阅读(225)  评论(0编辑  收藏  举报