Loading... # 引言 JS投毒事件还挺多的,检查所用的依赖是否在这个排查的列表里,一个一个找肯定麻烦,所以可以搞个脚本 # 列出依赖 `yarn list --depth=0` 这样的是一层的,类似于linux的`du`命令 ![yarn list --depth=0](https://www.zunmx.top/usr/uploads/2022/12/1681324704.png) 如果像获取最全面的依赖,那么直接`yarn list`就可以了,只是格式对于排查不太友好 ![yarn list](https://www.zunmx.top/usr/uploads/2022/12/488964790.png) # 准备工作 所以,全局替换一下吧 `─` `├ ` `[空格]` `│` 替换为空 此时excel中的列表可以理解为这样的字符串[package_name]\t[package_version]\n 中间是制表符,一行一个依赖包 而我们转换出来的是[package_name]@[package_version]\n # 码代码 ```python """ 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](https://www.zunmx.top/usr/uploads/2022/12/4134062426.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/12/3296856993.png) 不要出空行哈 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏