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();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|