9 月 9 日,WordPress 插件团队发了一则公告:以后每一个插件版本在通过官方更新接口分发之前,都要先过一道自动安全审查。对插件作者是流程变化,对用插件的站长来说,真正关心的只有两件事——我的更新会不会变慢,会不会有插件被拦下来。
一、这道审查具体怎么跑
四个环节。
冷却期。从 6 月 5 日开始,每个插件和主题版本在分发前都有一段冷却期,目前是 6 小时。作者提交新版本之后,不会立刻出现在你后台的更新提示里。
审查。冷却期内,这次改动会在 WordPress.org 侧被多个 AI 模型加上 Jetpack Scan 一起分析,几路结果交叉核验,合成一个安全评分。
拦截。评分越高代表风险越大,高分版本在审查结束后自动拦截,不再依赖插件团队有人在线值守。被拦的版本不会通过更新接口分发出去。
通知。被拦时,所有提交者会收到一封说明问题的邮件。作者没收到邮件,就说明这次没被拦。
二、为什么突然加这道关
公告里讲了一次刚发生的事。7 月 28 日,一个大约有两万活跃安装量的插件,某个版本被提交了后门代码。自动审查把这次改动识别出来并给出高分,因为版本还在冷却窗口内,带后门的包从头到尾没有通过更新接口分发出去。Wordfence 通知插件团队之后 26 分钟,该插件被关闭下载。
这次事件暴露的缺口很具体:识别出高风险之后,还得有人在线才能拦得住。公告的原话说的是,一套机制不能依赖插件团队刚好有人值班。所以现在改成高风险结果自动阻断分发。
公告里还有一句值得留意:交叉核验多个工具是为了提高准确率、压低误报,但误报不会降到零。
三、站长会实际感觉到的三件事
更新提示慢半拍。作者在后台点发布之后,你要等冷却期跑完(目前 6 小时)才可能看到这次更新。这不是作者偷懒。
偶尔有插件长时间没有新版本。可能是被拦着,也可能作者本来就慢。这两件事从你自己的后台看不出来,只能去插件页看版本时间。
高分不等于恶意。公告写得很直白:意外引入的漏洞和故意的恶意代码,可能得到一样高的评分;评分衡量的是风险,不是意图。所以看到某个插件被拦,先别直接把它当成有毒。
另外,审查规则会变。官方说这套流程会随数据积累不断调整,作者反馈的误报是最有用的输入。
四、站长这边能做点什么
你没法参与审查,但有三件事值得做。
第一,不要绕开冷却期。有些站为了早点用上刚发布的版本,会去第三方站下载安装包手动上传。这样做等于主动放弃了这道审查——而审查恰恰是在这 6 小时里跑的。
第二,定期比对本地插件和官方仓库的状态。下面这段脚本查的是你列出的插件在官方仓库里的最近更新时间,以及是否已被关闭下载。
<pre style1="background-color:#282c34;color:#abb2bf;padding:16px 20px;border-radius:8px;overflow-x:auto;font-family:Consolas,'Courier New',monospace;font-size:14px;line-height:1.7;margin:16px 0;-webkit-overflow-scrolling:touch;"><code style1="font-family:inherit;"><span style1="color:#7f848e;font-style:italic"># 检查插件在 WordPress.org 官方仓库的最近更新时间与状态</span>
import json, urllib.parse, urllib.request
<span style1="color:#7f848e;font-style:italic"># 把列表换成你站上插件的目录名(一般就是插件页地址里的那一段)</span>
PLUGINS = [<span style1="color:#98c379">"classic-editor"</span>, <span style1="color:#98c379">"wordpress-seo"</span>, <span style1="color:#98c379">"wp-super-cache"</span>]
<span style1="color:#c678dd">for</span> slug in PLUGINS:
url = (<span style1="color:#98c379">"https://api.wordpress.org/plugins/info/1.2/"</span>
<span style1="color:#98c379">"?action=plugin_information&request[slug]="</span> + urllib.parse.<span style1="color:#61afef">quote</span>(slug))
<span style1="color:#c678dd">try</span>:
with urllib.request.<span style1="color:#61afef">urlopen</span>(url, timeout=<span style1="color:#d19a66">10</span>) <span style1="color:#c678dd">as</span> r:
d = json.<span style1="color:#61afef">load</span>(r)
closed = <span style1="color:#98c379">"是"</span> <span style1="color:#c678dd">if</span> d.<span style1="color:#61afef">get</span>(<span style1="color:#98c379">"closed"</span>) <span style1="color:#c678dd">else</span> <span style1="color:#98c379">"否"</span>
<span style1="color:#c678dd">print</span>(<span style1="color:#98c379">"%-22s 最近更新: %-12s 已关闭下载: %s"</span>
% (slug, d.<span style1="color:#61afef">get</span>(<span style1="color:#98c379">"last_updated"</span>, <span style1="color:#98c379">"-"</span>), closed))
except <span style1="color:#e6c07b">Exception</span> <span style1="color:#c678dd">as</span> e:
<span style1="color:#c678dd">print</span>(<span style1="color:#98c379">"%-22s 查询失败: %s"</span> % (slug, e))</code></pre>
这段代码干什么用:拿插件目录名去问官方接口,返回它的最近更新时间和是否被关闭下载。要改哪里:把 PLUGINS 列表换成你站上实际装的插件目录名,数量随意。跑完看什么:某个插件最近更新停在很久以前、同时已关闭下载显示「是」,说明它出过安全事件被下架了,该找替代品了;只是长期没更新、状态正常的,属于作者维护节奏问题,风险另算。
第三,装插件前看版本节奏。一个半年没更新的插件,遇到新漏洞时没人修,比一次更新被拦危险得多。插件安全这件事上,维护活跃度比功能列表更值得看。
相关阅读:《WordPress 7.1 升级前必做的兼容性自查清单》
A5创业网 版权所有