资讯动态

eval与JSON.parse的代价:chromecast-backgrounds解析代码中的安全风险深度分析

发布时间:2026/8/24 9:51:15 来源:尧图企业网站定制
eval与JSON.parse的代价chromecast-backgrounds解析代码中的安全风险深度分析【免费下载链接】chromecast-backgroundsArchive of all Chromecast background images.项目地址: https://gitcode.com/gh_mirrors/ch/chromecast-backgroundschromecast-backgrounds是一个 Node.js 命令行小工具用于批量抓取 Chromecast 主页上的全部背景图片。它的核心文件index.js只用了一行eval就顺手解决了JSON.parse解析失败的问题——但正是这一行代码埋下了典型的eval 安全风险一旦远程内容被污染恶意语句就可能直接在本地执行。本文带你逐行拆解这段解析代码搞懂eval 与 JSON.parse 的本质区别并给出一套安全替代方案。一、chromecast-backgrounds 是做什么的一句话一条命令把 Chromecast 首页那几百张精美风景壁纸的链接全部抓下来还可以批量下载、按尺寸裁剪、导出 JSON 或 Markdown 清单。项目核心文件一览文件作用index.js抓取主页 HTML正则提取内嵌 JSON 状态⚠️ 风险点就在这里cli.js命令行入口支持--download、--size、--save等参数backgrounds.json抓取结果存档700 张背景图的 url 与作者test.js用 Mocha 验证解析结果的结构工作流程分三步请求 Chromecast 主页的 HTML用正则从 HTML 里抠出内嵌的JSON.parse(...)脚本片段执行它拿到包含全部背景图地址的数组整理成{ url, author }对象输出。二、风险代码逐行拆解一行 eval 的代价 index.js的关键逻辑只有三行var initJSONStateRegex /(JSON\.parse\(.\))\)\./; var matches htmlString.match(initJSONStateRegex); var initState eval(matches[1]);最后一行正是全部问题的源头作者从 HTML 里抓到的是一段可执行代码JSON.parse(...)而不是纯 JSON 文本。直接对这段文本调用JSON.parse会抛语法错误于是最省事的做法就是丢给eval原样执行源码注释原话I dont know why this is ok but JSON.parse fails。这里叠加了三层隐患执行远程内容HTML 来自外网接口eval等于无条件信任对方发来的任何字符若链路上被注入恶意语句会直接在进程里运行作用域污染eval在调用处作用域执行可以读写同作用域的其他变量正则脆弱.只匹配单引号字符串且是贪婪匹配页面一旦改用双引号或转义引号提取结果就不可控——不可控的字符串再去eval风险被进一步放大。三、eval vs JSON.parse为什么解析 JSON 别用 eval对比项evalJSON.parse能否执行任意代码✅ 能危险❌ 不能安全输入要求任意 JS 表达式严格 JSON 文本作用域影响污染当前执行作用域无副作用出错表现可能静默执行恶意逻辑直接抛 SyntaxError易发现性能需编译 JS 代码更慢原生解析更快一句话记住JSON.parse 只读数据eval 会跑代码。解析数据永远优先前者。四、JSON.parse 失败的真实原因与修复步骤 ️正则抓到的是函数调用表达式JSON.parse(...)而不是 JSON 本身。真正能交给JSON.parse的是括号里那串被转义的 JSON 字符串。安全修法三步走正则只提取引号内的字符串内容还原 JS 字符串的转义序列如\、\u003c再交给JSON.parse全程不执行任何代码并用try/catch兜底。var m html.match(/JSON\.parse\(((?:[^\\]|\\.)*)\)/); var initState JSON.parse(unescapeJs(m[1])); 更彻底的思路放弃抠 HTML改用官方接口或稳定的 JSON 端点对必须抓取的页面先校验响应内容再解析。顺带一提cli.js中对本地存档文件使用JSON.parse(read(...))的写法就是正确示范——数据可信来源 安全解析。五、安全编码加固清单新手可照抄✅永不eval来自网络或用户的字符串——这是 Node.js 代码安全的第一红线解析数据只用JSON.parse解析前try/catch 结构校验如Array.isArray正则提取要同时覆盖单/双引号、改用非贪婪匹配提取后先打日志验证再使用留意index.js中for (var i in ...)遍历数组的写法数组遍历应使用for...of或forEach避免意外遍历到原型链属性。写在最后chromecast-backgrounds 是个轻量的壁纸抓取工具但那一行图省事的eval是无数真实项目里的安全缩影eval 与 JSON.parse 的代价差距平时看不见出事就是代码注入。把能不能跑换成敢不敢跑是新手走向安全编码的关键一步。【免费下载链接】chromecast-backgroundsArchive of all Chromecast background images.项目地址: https://gitcode.com/gh_mirrors/ch/chromecast-backgrounds创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价