Skip to content

Commit db7d6c7

Browse files
committed
🐛 修复资源哈希校验
1 parent 61f7ad1 commit db7d6c7

4 files changed

Lines changed: 62 additions & 6 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "scriptcat",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "脚本猫,一个可以执行用户脚本的浏览器扩展,万物皆可脚本化,让你的浏览器可以做更多的事情!",
55
"author": "CodFrm",
66
"license": "GPLv3",

src/app/service/service_worker/utils.test.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, it, expect } from "vitest";
2-
import { parseUrlSRI } from "./utils";
2+
import { isBase64, parseUrlSRI } from "./utils";
33

44
describe("parseUrlSRI", () => {
55
it("should parse URL SRI", () => {
@@ -67,3 +67,31 @@ describe("parseUrlSRI", () => {
6767
expect(result3.hash).toEqual({ sha256: sha256b64 });
6868
});
6969
});
70+
71+
describe("isBase64", () => {
72+
it("should return true for valid base64 strings", () => {
73+
expect(isBase64("dGVzdA==")).toBe(true);
74+
expect(isBase64("7qAoOXltbVP82dhxHAUje59V5r2YsVfBafyUDxEdApLPmcdhBPg1DKg1ERo0BZlK")).toBe(true);
75+
expect(isBase64("zKeerWHHuP3ar7kX2WKBSENzb+GJytFSBL6HrR2nPSR1kOX1qjm+oHooQtbDpDBSITgyl7QXZApvDfDWvKjkUw==")).toBe(
76+
true
77+
);
78+
});
79+
80+
it("should return false for invalid base64 strings", () => {
81+
expect(isBase64("invalid_base64")).toBe(false);
82+
expect(isBase64("12345")).toBe(false);
83+
expect(isBase64("c4ca4238a0b923820dcc509a6f75849b")).toBe(false);
84+
expect(isBase64("356a192b7913b04c54574d18c28d46e6395428ab")).toBe(false);
85+
expect(isBase64("DaC17f958d2ee523a2206206994597c13D831eC7")).toBe(false);
86+
expect(isBase64("6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b")).toBe(false);
87+
expect(
88+
isBase64("47f05d367b0c32e438fb63e6cf4a5f35c2aa2f90dc7543f8a41a0f95ce8a40a313ab5cf36134a2068c4c969cb50db776")
89+
).toBe(false);
90+
expect(
91+
isBase64(
92+
"4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a"
93+
)
94+
).toBe(false);
95+
expect(isBase64("")).toBe(false);
96+
});
97+
});

src/app/service/service_worker/utils.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,39 @@ export function arrayToObject(arr: Array<any>): any[] {
6464

6565
// 检查是不是base64编码
6666
export function isBase64(str: string): boolean {
67-
if (typeof str !== "string") {
67+
if (typeof str !== "string" || str.length === 0) {
6868
return false;
6969
}
70-
// 检查字符串是否符合base64的格式
71-
return /^[A-Za-z0-9+/]+={0,2}$/.test(str) && (str.length % 4 === 0 || str.length % 4 === 2);
70+
71+
// Base64字符串必须只包含有效的Base64字符
72+
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
73+
if (!base64Regex.test(str)) {
74+
return false;
75+
}
76+
77+
// Base64字符串长度必须是4的倍数(如果有填充),或者没有填充的情况下可以是其他长度
78+
// 但要确保它不是纯数字或纯字母(避免误判十六进制字符串)
79+
const lengthMod4 = str.length % 4;
80+
if (lengthMod4 === 1) {
81+
// 长度除以4余数为1的字符串不可能是有效的Base64
82+
return false;
83+
}
84+
85+
// 检查是否包含Base64特有的字符(+ 或 /),或者有正确的填充
86+
// 这样可以避免将纯十六进制字符串误判为Base64
87+
if (str.includes("+") || str.includes("/") || str.endsWith("=")) {
88+
return true;
89+
}
90+
91+
// 如果没有特殊字符,检查是否可能是有效的Base64(但要排除明显的十六进制)
92+
// 十六进制字符串只包含0-9和a-f(或A-F),而Base64还包含其他字母
93+
const hexOnlyRegex = /^[0-9a-fA-F]+$/;
94+
if (hexOnlyRegex.test(str)) {
95+
// 这很可能是十六进制字符串,不是Base64
96+
return false;
97+
}
98+
99+
return true;
72100
}
73101

74102
// 解析URL SRI

src/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 3,
33
"name": "__MSG_scriptcat__",
4-
"version": "1.0.0",
4+
"version": "1.0.1",
55
"author": "CodFrm",
66
"description": "__MSG_scriptcat_description__",
77
"options_ui": {

0 commit comments

Comments
 (0)