jQuery-Cookie 代码静态分析规则:自定义 ESLint 规则
【免费下载链接】jquery-cookieNo longer maintained, superseded by JS 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 编码/解码逻辑不一致引发的兼容性问题
规则设计原则
- 精准匹配:基于源码特征设计选择器,如定位
$.cookie方法调用 - 渐进增强:规则分级别(error/warn),支持增量接入
- 自动化修复:对可自动修正的问题提供
--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
使用方法
- 安装自定义规则包
npm install eslint-plugin-jquery-cookie --save-dev
- 配置
.eslintrc.js
module.exports = {plugins: ['jquery-cookie'],rules: {'jquery-cookie/expires-type': 'error','jquery-cookie/json-safety': 'warn'}
};
规则验证与效果
通过对项目测试用例的增强验证,新规则可有效拦截以下问题:
- 非标准日期参数导致的 cookie 失效问题
- JSON 解析异常未捕获引发的运行时错误
- URL 编码不一致导致的跨浏览器兼容性问题
扩展建议
新增规则方向:
- 检测
path参数是否包含不可信用户输入 - 限制
domain属性的赋值范围
- 检测
自动化修复:
- 为
expires参数添加默认值 - 自动包裹 JSON 操作代码块
- 为
完整规则集与示例代码已集成至项目工具链,可通过test/tests.js验证规则有效性。
【免费下载链接】jquery-cookieNo longer maintained, superseded by JS Cookie: 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-cookie