如何拦截POST /admin/ HTTP/1.1类攻击,求WHM全局或站点级解决方案
POST /admin/ 请求拦截失效解决方法
原有代码失效原因
你之前写的两段PHP代码未生效,核心原因有三个:
- 仅在访问
/admin/index.php时触发,攻击者访问/admin目录下其他PHP文件即可直接绕过 - 代码中加了
empty($_GET)的判断条件,攻击者只要随便携带一个GET参数(如POST /admin/?t=1)就可以绕过拦截 - 部分服务器配置下,静态请求、前置代理转发的请求不会走到index.php的执行逻辑,规则自然不会生效
可行解决方案
方案1:.htaccess规则配置(单站点首选,优先级最高)
直接在/admin目录下新建.htaccess文件,添加以下规则即可拦截所有对该目录的POST请求:
<Limit POST> Require all denied </Limit>
如果需要对指定IP开放POST权限,可以调整为:
<Limit POST> Require ip 192.168.1.0/24 Require ip 127.0.0.1 </Limit>
该规则只要服务器支持.htaccess解析就会生效,优先级高于PHP代码,所有对admin目录的请求都会先经过规则校验,直接返回403状态码。
方案2:WHM全局配置(服务器多站点统一拦截首选)
如果需要对服务器上所有站点的/admin目录POST请求做统一拦截,直接在WHM中配置防火墙规则即可:
- 若使用CSF防火墙:进入WHM后台「Plugins」-「ConfigServer Security & Firewall」,在自定义规则中添加以下内容:
iptables -I INPUT -p tcp --dport 80 -m string --string "POST /admin/" --algo bm -j DROP iptables -I INPUT -p tcp --dport 443 -m string --string "POST /admin/" --algo bm -j DROP
- 若使用ModSecurity防火墙:添加以下安全规则即可:
SecRule REQUEST_URI "^/admin/" "chain,id:10001,deny,status:403,msg:'Block POST to admin directory'" SecRule REQUEST_METHOD "^POST$"
全局配置的优势是请求还未走到站点层面就会被拦截,服务器资源消耗更低,防护范围更广。
方案3:修复后PHP全局拦截代码(无服务器配置权限时使用)
如果无法修改.htaccess或者WHM配置,可以将拦截逻辑添加到admin目录下所有PHP文件都会加载的公共入口文件(如config.php、init.php)中,代码如下:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && strpos($_SERVER['REQUEST_URI'], '/admin/') === 0) { header($_SERVER['SERVER_PROTOCOL'] . " 403 Forbidden", true); exit; }
注意该方案仅能拦截走PHP解析的请求,无法拦截静态文件的POST请求。
内容的提问来源于stack exchange,提问作者qwertyg
相关产品推荐
相关产品推荐

