王一之 发表于 2022-12-15 20:38:32

脚本猫新API CAT_fileStorage 提案

调用此 API,可以操控`脚本同步`配置的文件储存源,将会在设定目录下创建一个`app`目录供此 API 使用.

API 定义如下

```js
/**
* 操控脚本同步配置的文件储存源,将会在同步目录下创建一个app/(uuid或者storageName)目录供此 API 使用
* 当声明了@storageName时,将会将文件上传至指定的@storageName目录,多个脚本也可用此声明公用一个文件夹
* 上传时默认覆盖同名文件
* @param action 操作类型 list 列出指定目录所有文件, upload 上传文件, download 下载文件, delete 删除文件
*/
declare function CAT_fileStorage(
action: "list",
details: {
    path?: string;
    onload?: (files: CATType.FileStorageFileInfo[]) => void;
    onerror?: (error: FileStorageError) => void;
}
): void;
declare function CAT_fileStorage(
action: "download",
details: {
    filename: string;
    onload: (data: Blob) => void;
    onprogress?: (progress: number) => void;
    onerror?: (error: FileStorageError) => void;
}
): void;

declare function CAT_fileStorage(
action: "delete",
details: {
    filename: string;
    onload?: () => void;
    onerror?: (error: FileStorageError) => void;
}
): void;

declare function CAT_fileStorage(
action: "upload",
details: {
    filename: string;
    data: Blob;
    onload?: () => void;
    onprogress?: (progress: number) => void;
    onerror?: (error: FileStorageError) => void;
}
): void;

interface FileStorageError {
    // 错误码 1 用户未配置文件储存源 2 文件储存源配置错误 3 路径不存在
    // 4 文件不存在 5 文件已存在 6 上传失败 7 下载失败 8 删除失败
    code: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
    msg: string;
}
interface FileStorageFileInfo {
    path: string;
    name: string;
    size: number;
    isDir: boolean;
}
```

经讨论有以下问题:
### storageName共享

直接的使用@stroageName来指定公共的储存空间容易产生恶意脚本篡改的问题,经哥哥们这么一说,觉得value的@storageName也得加上一些限制。
#### 解决方案

文件这里可以和哥哥们说的一样提供两个储存空间,一个私有的储存空间和公有的储存空间,在操作时通过一个参数指定是将文件储存在私有的还是公有的。
如果是公有的那么将会和GM_xhr一样弹出一个窗口需要用户确认。

初版先只实现私有的吧,公有的再斟酌斟酌

安全问题确实考虑得少,此次发布API提案进行讨论感觉效果不错,帮我考虑到了很多问题,以后如果有新特性加入,也会发布提案。

github issue:
https://github.com/scriptscat/scriptcat/issues/127

steven026 发表于 2022-12-15 21:38:57

蒸蒸日上!

cxxjackie 发表于 2022-12-15 22:14:47

storageName共享目录不太好吧,万一有别的脚本碰瓷,容易造成安全问题(比如A脚本下载js执行,B脚本上传恶意js,排查可能会认为是A脚本的问题)。我觉得共享value已经是最低限度,共享文件还是太激进了,如果真有必要,脚本面板那里一定要加醒目的提示(此文件目录被以下脚本共享使用:XXX)。

极品小猫 发表于 2022-12-16 09:09:26

cxxjackie 发表于 2022-12-15 22:14
storageName共享目录不太好吧,万一有别的脚本碰瓷,容易造成安全问题(比如A脚本下载js执行,B脚本上传恶 ...

加入Hash校验?
主要是怕保存重要数据会被恶意读取

王一之 发表于 2022-12-16 09:35:55

极品小猫 发表于 2022-12-16 09:09
加入Hash校验?
主要是怕保存重要数据会被恶意读取

咋hash校验,这个应该得脚本自己处理了

王一之 发表于 2022-12-16 09:50:55

cxxjackie 发表于 2022-12-15 22:14
storageName共享目录不太好吧,万一有别的脚本碰瓷,容易造成安全问题(比如A脚本下载js执行,B脚本上传恶 ...

确实有点激进,但是如果确实有共享目录的需求才会使用@storageName特性吧

不过value那里已经放开了,这里我觉得也可以,脚本从value读js执行也是一样的

另外就是,确实是要做一下醒目的提示,然后文件的上传下载做一些日志方便审计

而且这种恶意脚本都装下来了,这样去干了,为什么不直接点,自己去做恶意js的事情。

后续也考虑在设置中对上传的内容做一些限制,例如后缀/大小之类,或者默认禁止共享,得用户手动开启。安全这块脚本猫、脚本站做得确实还不太够

steven026 发表于 2022-12-16 11:00:40

王一之 发表于 2022-12-16 09:50
确实有点激进,但是如果确实有共享目录的需求才会使用@storageName特性吧

不过value那里已经放开了,这 ...

话说哥哥value那边是怎么个放开法?
之前试了半天 沙盒环境禁止操作IndexedDB……没法通过脚本读写其他脚本的GM_get/setValue

王一之 发表于 2022-12-16 11:11:27

steven026 发表于 2022-12-16 11:00
话说哥哥value那边是怎么个放开法?
之前试了半天 沙盒环境禁止操作IndexedDB……没法通过脚本读写其他脚 ...
同@storageName的get/set/deleteValue是共享的呀

描述文档 | ScriptCat

API 文档 | ScriptCat

极品小猫 发表于 2022-12-16 11:20:34

王一之 发表于 2022-12-16 09:35
咋hash校验,这个应该得脚本自己处理了

就是由API去算文件的Hash并记录,不匹配的时候进行拒绝并警告

steven026 发表于 2022-12-16 11:33:12

王一之 发表于 2022-12-16 11:11
同@storageName的get/set/deleteValue是共享的呀

描述文档 | ScriptCat


0.0
油猴好像不共享
共享感觉的确会有安全问题 我之前自动登录账号密码都是存在Value里面的
这样别的脚本和我用同一个storageName不是能随便读了?
页: [1] 2 3
查看完整版本: 脚本猫新API CAT_fileStorage 提案