yarn 获取依赖以及子依赖列表,安装的依赖是否在待排除列表

引言

JS投毒事件还挺多的,检查所用的依赖是否在这个排查的列表里,一个一个找肯定麻烦,所以可以搞个脚本

列出依赖

yarn list --depth=0
这样的是一层的,类似于linux的du命令
yarn list --depth=0

如果像获取最全面的依赖,那么直接yarn list就可以了,只是格式对于排查不太友好
yarn list

准备工作

所以,全局替换一下吧
─ ├ [空格] │ 替换为空

此时excel中的列表可以理解为这样的字符串[package_name]\t[package_version]\n
中间是制表符,一行一个依赖包

而我们转换出来的是[package_name]@[package_version]\n

码代码

"""
setup_packages 里面每行是你所安装的依赖
black_list_packages 是被禁止的依赖,遵循package_name[\t]version\n格式
"""
setup_packages = """***"""
black_list_packages = """***"""
black_pkg_list = black_list_packages.split('\n')  # 先对被禁止的列表进行行截取
black_packages_has_installed = []  # 这是存储已经安装了的,并且在黑名单里存在的
for line in black_pkg_list:
    split = line.split("\t")  # 根据制表符分割,因为直接从excel里粘贴过来,单元格与单元格是\t分割的
    if len(split) != 2:  # 如果不满足,那么肯定是粘贴时候出错了,或者存在空行了
        print('[x] Format Error', line)
        exit(1)
    else:
        if split[0] in black_packages_has_installed:  # 排除待排查中重复标记的数据
            continue
        find = setup_packages.find(split[0])  # split[0]是黑名单里面的名字部分,也就是在已安装的列表里面找有没有这个名字

        if find > -1:  # 如果有,那么就要进行版本对比了
            stmp = setup_packages[find:setup_packages.find('\n', find)]  # 截取已安装列表中,找到名字的部分到换行符,也就是这个依赖的名字和版本信息
            ied = stmp.split("@")  # 依赖包和版本之间是@连接,所以根据@分割
            if len(ied) == 3:  # 如果是3个,就说明这个依赖是@开头的,匹配的话就会出现问题,所以自己拼接一下
                ied[0] = '@' + ied[1]
                ied[1] = ied[2]
                del ied[2]
            if ied[0] != split[0]: continue  # 名字如果不匹配,那就跳过
            if ied[1] != split[1]: continue  # 版本如果不匹配,也跳过
            num = len(black_packages_has_installed) + 1  # 记录部分的计数器
            black_packages_has_installed.append(split[0])  # 把存在黑名单的一安装依赖记录下来
            print(
                f"""[{num}]--------------------------------------------\n    forbidden package {split} \n    installed package {ied}\n[{num}]--------------------------------------------""")
        else:
            pass
            # print(f"[i] checking [{split[0]}], but not found")
num = len(black_packages_has_installed)
if num == 0:  # 如果记录器为空,那么安装的所有依赖都没有在黑名单里
    print("[i] Not found forbidden packages")
else:  # 否则就存在,并且输出出来
    print(f"[!] Found forbidden packages {num}")
    print("[!]", black_packages_has_installed)

返回值样例

[i] Not found forbidden packages

Process finished with exit code 0
[1]--------------------------------------------
forbidden package ['vue-loader25', '1.0.0']
installed package ['vue-loader25', '1.0.0']
[1]--------------------------------------------
[!] Found forbidden packages 1
[!] ['vue-loader25']
[1]--------------------------------------------
forbidden package ['vue-loader25', '1.0.0']
installed package ['vue-loader25', '1.0.0']
[1]--------------------------------------------
[2]--------------------------------------------
forbidden package ['vue-loader24', '1.0.1']
installed package ['vue-loader24', '1.0.0']
[2]--------------------------------------------
[!] Found forbidden packages 2
[!] ['vue-loader25', 'vue-loader24']

Process finished with exit code 0

字符串样例截图

image.png

image.png

不要出空行哈

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。