Skip to content

outline: 'deep'## 一、背景与问题

我国实行网络安全等级保护制度,等级保护对象分为五个级别,由一到五级别逐渐升高,每一个级别的要求存在差异,级别越高,要求越严格。在我国,“三级等保”是对非银行机构的等级保护认证。
随着《网络安全》、《数据安全》等相关法律的颁布和执行,越来越多的系统都需要在安全上面多做一些功能。
如若不加强安全防护功能的话,企业也将会被叫去喝茶(因为我们就被叫去过喝茶。。),所以我们痛并思痛,必须加上如下功能:

二、思想

按照如下要求:

2019-12-01 实施《信息安全技术-网络安全等级保护基本要求》GB/T 22239一2019
其中8、第三级安全要求:
a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并 定期更换;
b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动 退出等相关措施;
c) 当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;

整理出如下功能:

  • 1、连续登录失败 5 次锁定账户 30 分钟,登录超时时长建议为 300-1800 秒;
  • 2、建议对重要业务数据、重要个人信息采用经国家密码管理局认可的密码技术保证存储过程中数据的保密性。
  • 3、平台密码复杂度至少三种字符,最小 8 位且不设置为常用密码
  • 4、接口加密和解密
  • 5、针对 sql 注入进行过滤拦截

三、具体使用

3.1、后端配置

打开 对应环境的 application.yaml 文件,修改如下配置:

yaml
####################################### 安全等级保护 相关配置 ##################################################
#                                                                                                            #
# 建议开启 "三级等保" 所要求的配置,具体如下:                                                                     #
#   1)连续登录失败 5 次锁定账户 30 分钟,                                                                       #
#   2)登录超时时长建议为 30分钟,超过此时间没有访问系统会重新要求登录                                               #
#   3)密码复杂度至少三种字符,最小 8 位                                                                         #
#                                                                                                           #
#############################################################################################################

classified-protect:
  # 连续登录失败次数则锁定,-1表示不受限制,可以一直尝试登录
  login-max-fail-times: 5
  # 连续登录失败锁定时间(单位:秒),-1表示不锁定,建议锁定30分钟
  login-fail-locked-seconds: 1800
  # 密码复杂度开启(默认复杂度为:至少三种字符,最小 8 位), true 开启,false 不开启,建议开启
  password-complexity-enabled: true

sa-token:
  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  active-timeout: 1800
  # token 有效期(单位:秒) 1天(86400秒),-1 代表永久有效
  timeout: 86400

3.2、前端功能

找到菜单 ”网络安全“,即可看到相关功能。

四、演示案例

登录失败 5 次锁定账户 30 分钟登录超时时长建议为 300-1800 秒解锁

五、原理

5.1 连续登录失败 5 次锁定账户 30 分钟

数据库使用表结构:t_login_fail 用于记录 已经登录失败的次数,和最后登录失败的时间,用于计算解锁时间。
后端代码核心为net.lab1024.sa.base.module.support.securityprotect包,其中ProtectLoginService为处理 登录超时和解锁操作。

5.2 登录超时时长建议为 300-1800 秒

此功能直接使用 sa-token自带的功能,即在application.yaml配置如下参数即可:

yaml
sa-token:
  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  active-timeout: 1800

5.3 密码复杂度

实现类为:ProtectPasswordService,核心正则:

java
@Service
public class ProtectPasswordService {

    /**
     * 密码长度8-20位且包含大写字母、小写字母、数字三种
     */
    public static final String PASSWORD_PATTERN = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,20}$";

5.4 SQL注入

所有SQL注入的可能性都发生在 分页查询排序参数上,所以在 SmartPageUtil中添加 SqlInjectionUtils.check(sortItem.getColumn() 进行检查,代码如下:

java
@Slf4j
public class SmartPageUtil {

    /**
     * 转换为查询参数
     */
    public static Page<?> convert2PageQuery(PageParam pageParam) {
        Page<?> page = new Page<>(pageParam.getPageNum(), pageParam.getPageSize());

        List<PageParam.SortItem> sortItemList = pageParam.getSortItemList();
        if (CollectionUtils.isEmpty(sortItemList)) {
            return page;
        }

        // 设置排序字段并检测是否含有sql注入
        List<OrderItem> orderItemList = new ArrayList<>();
        for (PageParam.SortItem sortItem : sortItemList) {

            if (SmartStringUtil.isEmpty(sortItem.getColumn())) {
                continue;
            }

            if (SqlInjectionUtils.check(sortItem.getColumn())) {
                log.error("《存在SQL注入:》 : {}", sortItem.getColumn());
                throw new BusinessException("存在SQL注入风险,请联系技术工作人员!");
            }

            orderItemList.add(new OrderItem(sortItem.getColumn(), sortItem.getIsAsc()));
        }
        page.setOrders(orderItemList);
        return page;
    }

outline: 'deep' outline: 'deep'## 联系我们 1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。

加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
“烩面里加肉”
“ 咖啡配胡辣汤,提神又饱腹”
抖音 : 六边形工程师
直播:赚钱、代码、中医