实用指南:jQuery-Cookie 代码静态分析规则:自定义 ESLint 规则

jQuery-Cookie 代码静态分析规则:自定义 ESLint 规则

【免费下载链接】jquery-cookieNo longer maintained, superseded by JS Cookie:【免费下载链接】jquery-cookie 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-cookie

jQuery-Cookie 作为经典的 Cookie 操作库,其源码src/jquery.cookie.js中存在诸多可通过静态分析约束的编码模式。本文将从源码特性出发,构建自定义 ESLint 规则以保障代码质量,解决实际开发中的常见问题。

规则设计背景

核心功能与风险点

jQuery-Cookie 提供 cookie 读写、删除等核心功能,其实现依赖于document.cookie操作和复杂的参数处理逻辑。通过分析测试用例test/tests.js,发现以下高频问题:

  • 未校验的expires参数类型导致的日期计算错误
  • JSON 序列化/反序列化异常未捕获
  • URL 编码/解码逻辑不一致引发的兼容性问题

规则设计原则

  1. 精准匹配:基于源码特征设计选择器,如定位$.cookie方法调用
  2. 渐进增强:规则分级别(error/warn),支持增量接入
  3. 自动化修复:对可自动修正的问题提供--fix支持

关键规则实现

1. 日期参数类型校验规则

问题场景:当expires参数传入非数字/Date 类型时,会导致 cookie 立即过期。

规则实现

module.exports = {
  meta: {
    fixable: null,
    type: 'problem'
  },
  create(context) {
    return {
      CallExpression(node) {
        if (node.callee.object?.name === '$' &&
            node.callee.property?.name === 'cookie' &&
            node.arguments.length === 3) {
          const options = node.arguments[2];
          if (options.type === 'ObjectExpression') {
            const expiresProp = options.properties.find(
              p => p.key.name === 'expires'
            );
            if (expiresProp &&
                !['Literal', 'Identifier', 'MemberExpression'].includes(
                  expiresProp.value.type
                )) {
              context.report({
                node: expiresProp.value,
                message: 'expires must be number or Date instance'
              });
            }
          }
        }
      }
    };
  }
};

检测效果:拦截非标准类型的 expiration 设置,如函数调用返回值直接传入。

2. JSON 安全处理规则

问题场景:启用json: true时,无效 JSON 字符串会导致解析异常。

规则实现

// 关键检测逻辑
if (jsonProp && jsonProp.value.value === true) {
  // 检查是否包含 try/catch 包裹
  const hasTryCatch = context.getAncestors(node).some(
    ancestor => ancestor.type === 'TryStatement'
  );
  if (!hasTryCatch) {
    context.report({
      node: jsonProp,
      message: 'JSON cookie operations require try/catch'
    });
  }
}

规则集成与使用

目录结构

eslint-rules/
├── rules/
│   ├── cookie-expires-type.js
│   └── json-safety.js
├── tests/
│   └── rule-tester.js
└── index.js

使用方法

  1. 安装自定义规则包
npm install eslint-plugin-jquery-cookie --save-dev
  1. 配置.eslintrc.js
module.exports = {
  plugins: ['jquery-cookie'],
  rules: {
    'jquery-cookie/expires-type': 'error',
    'jquery-cookie/json-safety': 'warn'
  }
};

规则验证与效果

通过对项目测试用例的增强验证,新规则可有效拦截以下问题:

  • 非标准日期参数导致的 cookie 失效问题
  • JSON 解析异常未捕获引发的运行时错误
  • URL 编码不一致导致的跨浏览器兼容性问题

扩展建议

  1. 新增规则方向

    • 检测path参数是否包含不可信用户输入
    • 限制domain属性的赋值范围
  2. 自动化修复

    • expires参数添加默认值
    • 自动包裹 JSON 操作代码块

完整规则集与示例代码已集成至项目工具链,可通过test/tests.js验证规则有效性。

【免费下载链接】jquery-cookieNo longer maintained, superseded by JS Cookie:【免费下载链接】jquery-cookie 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-cookie

posted @ 2025-11-29 12:02  yangykaifa  阅读(7)  评论(0)    收藏  举报