ColdFusion 跑在 IIS 上?先查有没有遗留 PHP,再安全卸掉
如果你在 Windows+IIS 上跑 ColdFusion 或 Lucee,却从没主动装过 PHP,仍有可能服务器上留着 phpMyAdmin 或全局 PHP 处理程序。独立站长 Gregory Alexander 在 2026 年 10 月 23 日的博文里,记录了自己被「整站 multipart 防护」误伤登录页之后,用几段 PowerShell 把遗留 PHP 找干净并移除的过程。下面按运维可读的顺序整理——只谈检查与卸载,不展开任何漏洞利用细节。
为什么 ColdFusion 站点会撞上 PHP 规则
2026 年 10 月 21 日前后,PHP 侧发布紧急补丁(文中点名的修复版本包括 8.5.12、8.4.27、8.3.36、8.2.35 等)。部分主机商用 IIS 全局 URL Rewrite 做临时缓解:按内容类型拦截 multipart/form-data。规则若作用在整台服务器所有站点、所有路径,ColdFusion 的登录、图片与文件上传同样会 403——即便站点一行 PHP 都没有。
作者把规则收窄到仅匹配 .php 地址后,CF 表单恢复。接着他发现多年前为管 MySQL 装的 phpMyAdmin 仍在站点目录里,登录页还对着公网。主机确认不再使用 PHP 后关掉全局规则;作者则把「还有没有 PHP」当成例行体检。
准备工作
Windows 服务器,管理员 PowerShell。
知道站点物理路径(下文示例用
C:\inetpub\wwwroot,请换成你的站点根)。先确认业务确实不依赖任何 PHP 应用;若主机代装了面板自用 PHP,卸之前先问主机。
操作步骤
1、看 IIS 会不会把 .php 交给 PHP
Import-Module WebAdministration
Get-WebHandler -PSPath 'IIS:\Sites' | Where-Object { $_.path -like '*.php' } | Select-Object name, path, scriptProcessor做什么:列出路径模式含
*.php的处理程序。为什么:没有 handler,IIS 就不会跑 PHP;有输出则记下
name与scriptProcessor,后面删除要用。怎么确认成功:无输出=当前继承配置下不跑 PHP;有类似
FastCGI *.php C:\php\php-cgi.exe的行=仍挂着。
2、扫站点里有没有 .php 文件
大目录用 dir 比 Get-ChildItem -Recurse 更快:
cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | Measure-Object | Select-Object Count按文件夹汇总、以及按修改时间看最近变动:
cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | ForEach-Object { Split-Path $_ -Parent } | Group-Object | Sort-Object Count -Descending | Select-Object -First 25 Count, Name | Format-Table -AutoSize
cmd /c "dir C:\inetpub\wwwroot\*.php /s /b" 2>$null | Get-Item | Sort-Object LastWriteTime -Descending | Select-Object -First 15 LastWriteTime, Length, FullName | Format-Table -AutoSize做什么:计数、定位目录、看最近改动的 PHP 文件。
为什么:遗留 phpMyAdmin、面板残骸,或上传目录里异常脚本,都会以
.php现身。怎么确认成功:Count 为 0;若非 0,应能指出具体文件夹。作者案例里曾扫到约 4500 个文件,集中在两处 phpMyAdmin。
若出现不认识、散落在上传/图片目录、或近期被改过的 PHP 文件,先当可疑入侵处理,再谈「清理遗留」。
3、看进程与安装目录(辅助)
Get-Process php* -ErrorAction SilentlyContinue | Select-Object Name, Id, StartTime
Test-Path C:\php没有 php-cgi 进程只说明最近没人点 PHP 页;仍以第 1 步 handler 为准(IIS 按需拉起)。
4、从外网看常见入口是否还开着
把域名换成自己的,探测常见路径是否 200:
foreach ($path in "phpmyadmin/", "phpMyAdmin/", "pma/", "info.php") {
$url = "https://www.example.com/$path"
try { $r = Invoke-WebRequest $url -UseBasicParsing -TimeoutSec 15; "$($r.StatusCode) $url" }
catch { "$($_.Exception.Response.StatusCode.value__) $url" }
}公网还能打开的 phpMyAdmin 登录页,等于长期暴露数据库管理面。
5、确认无依赖后,按顺序卸干净
备份 IIS 配置(可一键还原):
& "$env:windir\System32\inetsrv\appcmd.exe" add backup "before-php-removal"移走 phpMyAdmin 等 PHP 应用(先挪到私有目录,勿直接删;配置里可能有库密码)。文件占用时再短暂停 IIS:
iisreset /stop→ 移动 →iisreset /start。之后可用 HeidiSQL、MySQL Workbench 等桌面工具经 RDP 管库。在服务器级请求筛选里禁止
.php扩展(任何站点访问.php都会在进 handler 前被拒):
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/security/requestFiltering/fileExtensions' -Name '.' -Value @{ fileExtension = '.php'; allowed = 'false' }删 handler 与 FastCGI 项(名称与路径用第 1 步记下的值替换):
Remove-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/handlers' -Name '.' -AtElement @{ name = 'FastCGI' }
Remove-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/fastCgi' -Name '.' -AtElement @{ fullPath = 'C:\php\php-cgi.exe' }再跑一遍第 1 步,应无输出。
最后才卸载 PHP:控制面板卸安装包,或把
C:\php先改名为C:\php-removed观察数周。主机代装的先征得同意。
若必须保留主机的缓解规则,把它的匹配从「所有 URL」改成只匹配 .php(规则名按实际修改),避免再误伤 CF 表单。改完用 Select-String 核对 applicationHost.config,并告知主机以免他们的巡检脚本静默写回旧规则。
注意事项
全局规则伤及所有站点;突然 403 时读完整 IIS 错误页,往往能看到规则名。
改错
web.config(站点级)可能看起来「没生效」——以 IIS 实际读取的applicationHost.config为准。ColdFusion Trusted Cache 可能让你手动替换的
.cfm仍跑旧编译结果;诊断时可换新文件名绕过。卸 PHP 不能代替「仍在用 PHP 时的升级」:若业务还跑 PHP,应按官方渠道升到已修复版本,并遵循厂商临时缓解建议。PHP 8.1 及更早已离开项目更新轨道。
Linux+Apache/Lucee 可用 php -v、apachectl -M | grep -i php、find 扫 .php;Debian/Ubuntu 上 a2dismod 后重启 Apache,再确认面板是否自用 PHP。
以下步骤基于 Gregory Alexander 2026年10月23日公开博文,于 2026年10月27日整理;菜单与模块名随 Windows/IIS 版本可能略有差异。
来源
[1] Is PHP Quietly Running on Your ColdFusion Server? How to Check, and Remove It,Gregory Alexander,2026年10月23日。
#ColdFusion #IIS #PHP #运维 #安全加固

成为第一条评论!
Nobody's responded to this post yet. Add your thoughts and get the conversation going.