先给结论:当外部脚本用途不明时,不要先删脚本,也不要先给它加权限,而是先做一份“权限待核对清单”,把脚本能触达的对象、当前授权状态、缺失证据三列写清。只有拿到用途说明和责任人确认后,才进入下一步;如果拿不到,就按最小权限原则降级或隔离,而不是继续扩大授权。
条件一:你能联系到脚本提供方或内部引入人,只是暂时没有文档。这时清单的重点是“待确认项”,每一项都要有明确的确认对象和确认方式,比如谁负责说明它为何需要读取页面内容、为何需要写入表单。清单可以先粗后细,但必须能支撑一次对话,而不是变成一份无人认领的表格。
条件二:联系不上提供方,或引入人已离职、记录缺失。这时清单的重点从“确认用途”转为“限制影响面”。你要先假设它可能做任何它技术上能做的事,再逐项标记哪些权限是当前页面功能必需的、哪些是可替代的。缺少完整数据并不妨碍你执行最小动作:先记录它加载在哪些页面、能读到哪些字段、是否发起跨域请求。
选择依据很简单:有责任人时优先核对用途,无责任人时优先收缩权限。两种条件不能混用,否则容易在没弄清用途前就把它当成可信组件。
用途不明的脚本,名字往往没有信息量。清单应按它可能触达的对象分组,每组至少写清三件事:触达对象、当前授权状态、缺失证据。可以按下面的顺序整理:
清单里不要只写“权限过大”这种结论,要写成可核对的句子,例如“当前可读取结算页表单字段,但无证据表明结算流程需要该读取”。这样后续无论是找提供方确认还是做隔离,都有具体抓手。
假设某页面加载了一个外部脚本,它当前能读取页面上的输入框并向外发起请求。你先把这两项写入清单,标记为“待确认用途”。
接下来只做一个最小动作:在测试环境里暂时阻断它的外部请求,观察页面核心功能是否仍然可用。如果核心功能不受影响,说明该请求很可能不是必需项,下一步就可以在生产环境按同样方式限制,并继续找引入人确认。如果核心功能立刻失效,说明它至少承担了某项可见功能,下一步不是放行全部权限,而是把失效点记录下来,缩小到具体功能再核对。
这个动作的结果直接决定下一步:能阻断就优先隔离,不能阻断就转为定向核对,而不是一次性放开所有权限。需要说明的是,请求量归零本身不能证明脚本无害,它也可能是被缓存、被其他脚本接管或根本没触发,所以清单里仍要保留“未验证”的状态。
清单能帮你整理待核对项,但不能替你证明脚本安全。以下推论都不成立:
因此清单的产出应该是“待确认”和“已限制”两类状态,而不是“安全”或“不安全”的结论。缺少完整数据时,能执行的最小动作就是记录触达范围、阻断非必需请求、保留证据,然后等责任人确认后再决定是否恢复。
如果脚本运行在隔离环境、无法读取真实用户数据、也不接触关键流程,那么可以先保留现状,同时把它列入定期核对清单。这个例外的适用条件是:影响面被限制在测试或展示范围内,且没有写入和跨域请求能力。一旦它进入真实用户页面或关键流程,例外就不再成立,必须回到前面的收缩权限动作。
整理权限清单的目的不是一次性消灭所有外部脚本,而是让每一个不明用途的脚本都有明确的核对对象和可回退的动作。拿到责任人确认后,再决定是保留、替换还是移除;拿不到确认时,按最小权限处理,并把这个状态写进下一次核对。