php与cron自动实现封锁攻击者ip的代码

发布时间:2020-05-20编辑:脚本学堂
当有人用webbench攻击你的网站时,此时可以考虑用php与cron结合实现自动封锁攻击者IP地址的功能。有需要的朋友,可以参考下。

原理分析:
用php取得攻击者的agent头,判断是不是webbench来访,如果是就die掉,不在请求数据库,确实挺有效,数据库不会再超出限制了,但是对方频繁的发送请求过来,导致网络带宽被严重消耗。

最终解决方法:用php取得用户agent头判断是否是webbench来源,如果是的话就在服务器上写一个shell档案,这个档案的内容就是封锁IP的规则,然后再用chmod函数修改一下这个档案让其可执行,再用cron服务读取这个档案执行,把ip封锁掉,整个过程全部自动化完成不需要人为干预,同时可以发邮件给攻击者警告他。

代码:

<?php
/**
 * 封锁攻击者IP地址
 * www.jb200.com
*/
IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {
    $_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);
    IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {
        $p='/home/www/webbench.sh';
 
        $_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';
        <span style="color: #ff0000;">File_Put_Contents($p,"#!/bin/bashniptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;n",LOCK_EX);
</span>     Chmod($p,0755);
        chown($p,'www');
        <span style="color: #ff0000;">Function sMail($to,$tit,$msg) {
            IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){
                throw new Exception('電郵地址錯誤!');
            }
 
            $tit='=?UTF-8?B?'.Base64_Encode($tit).'?=';
            $msg = str_replace("n.","n..",$msg);      //Windows如果在一行开头发现一个句号则会被删掉,要避免此问题将单个句号替换成两个句号
 
            Return Mail($to,$tit,$msg,'From:No-reply@adm.bossadm.com.tw'."n".'Content-Type:text/html;charset=utf-8');
        }
        sMail('see7di@gmail.com','【WebBench又開始了-by http://www.jb200.com】!',date('Y-m-d H:i:s',time())." {$_SERVER['REMOTE_ADDR']}");</span>
 
        Header('Location:http://127.0.0.1');
        Die();
    }
}
?>

把發email的部份寫入了shell文件內,不再用php發email,因為那會灌爆你的信箱。
修改后的代码:

<?php
/**
 * 自动封锁恶意攻击者的IP地址
 * www.jb200.com
*/
IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {
    $_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);
    IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {
        $p='/home/www/webbench.sh';
 
        $_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';
        File_Put_Contents($p,"#!/bin/bashniptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;necho "{$_SERVER['REMOTE_ADDR']} - `date`" | mail -s "WebBench-www.jb200.com" see7di@gmail.comn",LOCK_EX);
        Chmod($p,0755);
        chown($p,'www');
        Header('Location:http://127.0.0.1');
        Die();
    }
}
?>