历史版本8 :安全防护 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 描述编辑

出于平台安全性考量,管理系统的安全防护模预设四个安全功能开关:Cookie 增强、文件上传校验、脚本调用公式限制、Security Headers。

2. 介绍编辑

打开决策平台,选择管理系统>安全管理-安全防护,如下图所示:

注:其中 Cookie 增强默认关闭,另外三个默认开启

1.png


2.1 Cookie 增强

注:要求服务器开启 https(Cookie 增强中 Secure 属性要求开启 https 否则不发送 Cookie)。

Cookie 增强功能点击开启时会对当前协议进行检测,检测结果为 https 时正常开启,检测结果为 http 时弹窗提示“检测到当前协议为 http,未能成功启用。请确认服务器开启 https 后重试”,并开启失败,如下图:

2.png


2.2 文件上传校验

开启后,对填报及平台外观配置中上传文件的后缀和大小进行校验。

1)通过校验文件二进制头,禁止上传后缀与实际不符合的文件(比如 a.txt 改成 a.jpg 后上传)

2)平台外观设置中禁止上传超过 20M 的图片,防止程序挂死(填报上传文件大小通过控件的大小限制自行做出限制),上传超出限制大小的图片弹出提示框,提示信息为使显示效果较佳,请选择尺寸不小于 1024*768,大小不超过20M的图片,支持 PNG、JPG 格式

2.3 脚本调用公式限制

2.3.1 描述

JS 中 FR.remoteEvaluate 这个接口,可以用来调用 SQL 公式,其使用频率较高,但这个接口也存在巨大的安全风险,FR.remoteEvaluate(formula) 中执行的 SQL 在请求中是明文的,只要某张模板使用了这个方法,或者攻击者知道有这个接口,就可以通过前端执行 JS 来实现对数据库的增删查改等操作,其风险等级已经相当于远程执行了。所以 FineReport9.0 和 FineReport10.0 都新增了脚本调用公式限制这一功能,当用户使用了 JS 中的 FR.remoteEvaluate这个接口,并且接口的 formula 使用的是公式中的报表类函数,如果用户开启了脚本调用公式限制开关,则效果预览时弹出提示框信息此调用存在安全风险,如需使用请在安全管理中修改脚本调用公式限制

注:如果用户没有相应使用场景,建议不要随便关闭该功能,关闭会有上述漏洞的风险,如有无法替代的场景可以提需求

2.3.2 示例

单元格 B4 输入Test,为单元格添加超级链接> JavaScript 脚本,如下图所示:

4.png

点击分页预览,点击Test,弹出提示框信息,如下图所示:

5.png

2.3.3 开关位置

FineReport10.0:登录决策系统,进入管理系统>安全管理>安全防护>脚本调用公式限制

6.png

FineReport9.0:登录决策系统进入管理系统>系统管理>常规>脚本调用公式限制

7.png

2.4 Security Headers

安全头系列设置,开启后将给请求头附加 HTTP Security Headers 属性,阻止漏洞攻击。

点击高级设置展开高级防护子功能开关,共五个,如下图所示:

注:当 Security Headers 功能开启时默认子功能全部开启,Security Headers关闭时默认全部关闭,同时不允许开启高级防护功能

3.png

Security Headers--安全头系列,其中包括:

1)CSP 内容安全策略——开启后,请求头部增加 Content-Security-Policy:object-src 'self' 设置

2)XSS 攻击防护——开启后,请求头部增加 X-XSS-Protection:1; mode=block 设置

3)点击劫持攻击防护——开启后,请求头部增加 X-Frame-Options:SAMEORIGIN 设置

4)内容嗅探攻击防护——开启后,请求头部增加 X-Content-Type-Options:nosniff 设置

5)浏览器缓存禁用——开启后,增加 Cache-Control:no-cache、Pragma:no-cache&Expires:0 设置

注:如果使用跨域 iframe 的方式嵌入报表,出现无法访问的情况,请关闭 Security Headers 高级设置中的点击劫持攻击防护功能

注:单点登录时若报跨域的问题,请关闭 Security Headers 高级设置中的内容嗅探攻击防护

默认开启的具体设置如下:

res.addHeader("X-Content-Type-Options", "nosniff");
res.addHeader("X-XSS-Protection", "1; mode=block");
res.addHeader("X-Frame-Options", "SAMEORIGIN");
res.addHeader("Content-Security-Policy", "object-src 'self'");
res.addHeader("Cache-Control", "no-cache");
res.addHeader("Pragma", "no-cache");
res.addDateHeader("Expires", 0);