119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace addons\webscan\library;
 | 
						|
 | 
						|
use addons\webscan\model\WebscanLog;
 | 
						|
use think\Cache;
 | 
						|
use think\Validate;
 | 
						|
 | 
						|
/**
 | 
						|
 * CC攻击助手
 | 
						|
 * @author amplam 122795200@qq.com
 | 
						|
 * @date 2019年10月30日 16:21:52
 | 
						|
 */
 | 
						|
class ChallengeCollapsar extends Server
 | 
						|
{
 | 
						|
    private $cachename = 'ChallengeCollapsar';
 | 
						|
    protected $config = [
 | 
						|
        'seconds' => 60,//多少秒以内
 | 
						|
        'refresh' => 60,//刷新、访问次数
 | 
						|
        'white_url' => "",
 | 
						|
    ];
 | 
						|
 | 
						|
    /**
 | 
						|
     * 构造函数
 | 
						|
     * WxPay constructor.
 | 
						|
     * @param $config
 | 
						|
     */
 | 
						|
    public function __construct($config = [])
 | 
						|
    {
 | 
						|
        $this->config = array_merge($this->config, $config);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * CC攻击防护开始
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function start()
 | 
						|
    {
 | 
						|
        //CC攻击URL白名单
 | 
						|
        if ($this->whiteUrl($this->config['white_url'])) return true;
 | 
						|
        //CC攻击URL白名单
 | 
						|
 | 
						|
        //ip白名单
 | 
						|
        if ($this->whiteIp($this->config['webscan_white_ip'])) return true;
 | 
						|
 | 
						|
        $now_time = time();
 | 
						|
        $ip = request()->ip();
 | 
						|
        $data = Cache::get($this->cachename . md5($ip));
 | 
						|
 | 
						|
        if ($data) {
 | 
						|
            $data['refresh_times'] = $data['refresh_times'] + 1;
 | 
						|
        } else {
 | 
						|
            $data['refresh_times'] = 1;
 | 
						|
            $data['last_time'] = $now_time;
 | 
						|
        }
 | 
						|
 | 
						|
        if (($now_time - $data['last_time']) < $this->config['seconds']) {
 | 
						|
 | 
						|
            if ($data['refresh_times'] >= $this->config['refresh']) {
 | 
						|
                $captcha = request()->param('captcha');
 | 
						|
                if (!$captcha) {
 | 
						|
                    //保存访问日志 相等才保存,不然可能会很多日志
 | 
						|
                    if ($data['refresh_times'] == $this->config['refresh']) {
 | 
						|
                        $logs = array('ip' => $ip, 'page' => $_SERVER["PHP_SELF"], 'method' => request()->method(), 'rkey' => "CC攻击", 'rdata' => '', 'user_agent' => $_SERVER['HTTP_USER_AGENT'], 'request_url' => $_SERVER["REQUEST_URI"], 'type' => 'cc');
 | 
						|
                        WebscanLog::create($logs);
 | 
						|
                        Cache::set($this->cachename . md5($ip), $data, 3600);
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($this->config['return_json']) {
 | 
						|
                        $this->config['return_json'] = str_replace("/", "\\/", $this->config['return_json']);
 | 
						|
                        if (preg_match("/^" . $this->config['return_json'] . "/is", request()->pathinfo())) {
 | 
						|
                            return $this->result("请输入验证码", [], '-1101', 'json');
 | 
						|
                        }
 | 
						|
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($this->getResponseType() !== 'html') {
 | 
						|
                        return $this->result("请输入验证码", [], '-1101', $this->getResponseType());
 | 
						|
                    }
 | 
						|
 | 
						|
                    header('Location: ' . addon_url('webscan/index/index', ['from' => $_SERVER['REQUEST_URI']]));//跳转到输入验证码界面
 | 
						|
                    exit;
 | 
						|
                }
 | 
						|
 | 
						|
                $rule['captcha'] = 'require|captcha';
 | 
						|
                $validate = new Validate($rule, [], ['captcha' => "验证码"]);
 | 
						|
                $result = $validate->check(['captcha' => $captcha]);
 | 
						|
 | 
						|
                if (!$result) {
 | 
						|
                    if ($this->config['return_json']) {
 | 
						|
                        $this->config['return_json'] = str_replace("/", "\\/", $this->config['return_json']);
 | 
						|
                        if (preg_match("/^" . $this->config['return_json'] . "/is", request()->pathinfo())) {
 | 
						|
                            return $this->result("验证码错误", [], '-1102', 'json');
 | 
						|
                        }
 | 
						|
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($this->getResponseType() !== 'html') {
 | 
						|
                        return $this->result("验证码错误", [], '-1102', $this->getResponseType());
 | 
						|
                    }
 | 
						|
 | 
						|
                    header('Location:' . addon_url('webscan/index/index', ['from' => $_SERVER['REQUEST_URI']]));//跳转到输入验证码界面
 | 
						|
                    exit();
 | 
						|
                }
 | 
						|
 | 
						|
                $data['refresh_times'] = 1;
 | 
						|
                $data['last_time'] = $now_time;
 | 
						|
            }
 | 
						|
 | 
						|
        } else {
 | 
						|
            $data['refresh_times'] = 1;
 | 
						|
            $data['last_time'] = $now_time;
 | 
						|
        }
 | 
						|
 | 
						|
        Cache::set($this->cachename . md5($ip), $data, 3600);
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
} |