最近维护一个运行在php虚拟主机上基于WordPress系统的简单网站发现被人注入挂马访问时会跳转广告,查了一下原因,确定是因为WP“无意”放出的漏洞,通过扫描文件夹和文件,找到有漏洞的文件然后恶意提交参数注入等,故而果断清空WP系统,然后深入研究php虚拟主机如何防止木马注入的方法,毕竟虚拟主机的设置是不受用户控制的,断断续续长达1个多月的摸索,意外发现我们可以利用404跳转来过滤全局链接。那就是整站动态化,不要index.php等默认首页文件,只留一个其他文件名的php文件,比如“404.php”,然后将404错误设置跳转到该文件,那么无论客户端访问什么链接都是经过“404.php”文件的,然后通过php脚本判断输出内容返回给客户端。
首先,给“404.php”加一句header,让该页面返回的状态不是404,否则部分浏览器会认为该页面真的不存在:
header("HTTP/1.1 200 OK"); header("status: 200 OK"); header('Content-type:text/html; charset=utf-8');
这样就和正常访问一样了,然后根据php内置“REQUEST_URI”参数获得客户端访问链接,即访问“xxx.com/a/b/c”可以返回“/a/b/c”字符串:
$re_url = $_SERVER['REQUEST_URI'];
最后根据获取到的参数用“pathinfo”分离出假的一级二级目录,判断服务端应该返回什么数据。
所有数据应该都存在别人想不到的文件夹,只能“404.php”读取并返回给客户端,至于返回动态数据就不用我多说了,php本来就是干这种事的。
这种方法也有缺点就是当使用pjax动态加载数据时,浏览器不能正常识别链接会自动跳转,需要手动修改pjax请求链接,返回数据后再修改浏览器地址栏,仅仅提供思路,也许后续会有更好的方法。
转载请注明来源:bikey 密钥 » 比较特殊的php虚拟主机防止注入的方法