144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace addons\webscan\library;
 | 
						|
 | 
						|
use addons\webscan\model\WebscanLog;
 | 
						|
use think\Config;
 | 
						|
use think\exception\HttpResponseException;
 | 
						|
use think\Request;
 | 
						|
use think\Response;
 | 
						|
use think\Url;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class server
 | 
						|
 * @package addons\webscan\library
 | 
						|
 */
 | 
						|
abstract class Server
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * 错误信息
 | 
						|
     * @var
 | 
						|
     */
 | 
						|
    protected $error;
 | 
						|
 | 
						|
    /**
 | 
						|
     * 返回错误信息
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    public function getError()
 | 
						|
    {
 | 
						|
        return $this->error;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * url白名单
 | 
						|
     * @param $white_url
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    protected function whiteUrl($white_url, $url_var = '')
 | 
						|
    {
 | 
						|
        if (!$white_url) return false;
 | 
						|
 | 
						|
        $url_var = $url_var ?: isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:'';
 | 
						|
        $url_var = strpos($url_var, '/') != 0 ?: substr($url_var, 1);
 | 
						|
        $search = ["/", "?", "=", ".", "&", '|'];
 | 
						|
        $replace = ["\/", "\?", "\=", "\.", "\&", '|^'];
 | 
						|
        $white_url = str_replace($search, $replace, $white_url);
 | 
						|
 | 
						|
        if (preg_match("/^" . $white_url . "/is", $url_var)) {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * ip白名单
 | 
						|
     * @param $white_ip
 | 
						|
     * @param string $ip
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    protected function whiteIp($white_ip, $ip = '')
 | 
						|
    {
 | 
						|
        $ip = $ip ?: \request()->ip();
 | 
						|
 | 
						|
        if ($ip && $white_ip) {
 | 
						|
            $webscan_white_ip_arr = explode(PHP_EOL, $white_ip);
 | 
						|
            if (count($webscan_white_ip_arr) > 0) {
 | 
						|
                if (in_array($ip, $webscan_white_ip_arr)) {
 | 
						|
                    return true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *  防护提示
 | 
						|
     */
 | 
						|
    protected function result($msg, $data = null, $code = 0, $type = null, array $header = [])
 | 
						|
    {
 | 
						|
        $url = '';
 | 
						|
 | 
						|
        if (is_null($url)) {
 | 
						|
            $url = Request::instance()->isAjax() ? '' : 'javascript:history.back(-1);';
 | 
						|
        } elseif ('' !== $url && !strpos($url, '://') && 0 !== strpos($url, '/')) {
 | 
						|
            $url = Url::build($url);
 | 
						|
        }
 | 
						|
 | 
						|
        $type = $type ?: $this->getResponseType();
 | 
						|
        $result = [
 | 
						|
            'code' => $code,
 | 
						|
            'msg' => $msg,
 | 
						|
            'data' => [],
 | 
						|
            'url' => $url,
 | 
						|
        ];
 | 
						|
 | 
						|
        if ('html' == strtolower($type)) {
 | 
						|
            $template = Config::get('template');
 | 
						|
            $view = Config::get('view_replace_str');
 | 
						|
            $result = \think\View::instance($template, $view)->fetch(Config::get('dispatch_error_tmpl'), $result);
 | 
						|
        }
 | 
						|
 | 
						|
        $response = Response::create($result, $type)->header($header);
 | 
						|
 | 
						|
        throw new HttpResponseException($response);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取当前的 response 输出类型
 | 
						|
     * @access protected
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected function getResponseType()
 | 
						|
    {
 | 
						|
        return Request::instance()->isAjax()
 | 
						|
            ? Config::get('default_ajax_return')
 | 
						|
            : Config::get('default_return_type');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *  日记记录
 | 
						|
     */
 | 
						|
    protected function webscanSlog($logs)
 | 
						|
    {
 | 
						|
        WebscanLog::create($logs);
 | 
						|
 | 
						|
        if ($this->config['black_auto'] > 0) {
 | 
						|
            $beginToday = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
 | 
						|
            if ((new WebscanLog())->where('ip', $logs['ip'])->where('create_time', '>', $beginToday)->count() >= $this->config['black_auto']) {
 | 
						|
                //加入黑名单
 | 
						|
                $config = get_addon_config('webscan');
 | 
						|
                //更新配置文件
 | 
						|
                $config['webscan_black_ip'] = $config['webscan_black_ip'] . PHP_EOL . $logs['ip'];
 | 
						|
                set_addon_config('webscan', $config);
 | 
						|
                \think\addons\Service::refresh();
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |