需先确认后门真实性,再人工核对扫描结果;定位外链引入点要逐层追查模板、主题文件及数据库;阻断需禁用危险函数并关闭allow_url_fopen;清理须检查数据库、缓存和.htaccess,最后抓包验证。

确认后门是否真实存在,别误删正常外链
很多所谓“PHP后门”其实是开发时留下的调试代码、第三方统计脚本或CDN加载的合法JS,直接删可能让网站功能异常。先用 grep -r "eval\|base64_decode\|gzinflate\|str_rot13\|file_get_contents.*http" /var/www/html/ 扫描可疑函数调用,再人工核对上下文——比如 file_get_contents('http://xxx.com/track.js') 看域名是否在运维白名单里,而不是一见远程URL就判定为恶意。
定位外链引入点:从HTML源码到PHP模板层层追查
外链脚本通常不是硬编码在PHP里,而是通过 include、require 或动态拼接路径引入。重点检查:
-
footer.php、header.php等公共模板中隐藏的echo file_get_contents(...)或print_r(file(...)) - 主题目录下的
functions.php或theme-options.php里带wp_remote_get(WordPress)或curl_exec的调用 - 数据库中存储的“自定义HTML代码”字段(如 WordPress 的
wp_options表里theme_mods_*或option_value含 base64 字符串)
找到后,用 hexdump -C 查看二进制内容,确认是否被混淆——有些后门会把 eval 拆成 ev'.'al 绕过简单字符串匹配。
阻断远程脚本加载:禁用危险函数 + 网络层拦截
光删文件不够,得切断执行链:
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini中禁用高危函数:disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source - Web服务器层加限制:Nginx 配置里用
location ~ \.php$ { fastcgi_param PHP_VALUE "allow_url_fopen=Off"; }关闭远程文件读取 - 如果必须保留某些外链(如字体CDN),用
allow_url_include=Off阻止include('http://...')类行为,它比allow_url_fopen更精准
注意:修改 php.ini 后必须重启 PHP-FPM 或 Apache,否则配置不生效。
清理残留:数据库和缓存常被忽略
后门代码可能藏在数据库里,尤其 CMS 类系统:
- WordPress:查
wp_posts表中post_content字段含document.write、eval(、unescape(的记录;查wp_options表中option_name为_transient_或_site_transient_开头的项,其option_value有时是 base64 编码的恶意 JS - 缓存文件:清空
/tmp、wp-content/cache、storage/framework/cache(Laravel)等目录,避免缓存中仍存在已删但未失效的恶意响应 - 检查
.htaccess是否被注入重定向规则,例如RewriteCond %{HTTP_USER_AGENT} .*Google.* [NC]后跟跳转到黑帽域名
改完记得用浏览器无痕模式+不同UA访问首页,抓包看 Network 面板是否还有未知域名的 JS/CSS 请求——这才是验证是否真正阻断的关键一步。











