<?php
namespace attack;
// 防止攻击
class Attack2
{
// -----------------------------------------------------------------【方案一】使用User-Agent过滤----------------------------------------------------------------------------
/**
* 使用User-Agent过滤
* User-Agent是浏览器或机器人使用的标识符,可以用来区分不同的用户或机器人;
* 使用php可以通过$_SERVER['HTTP_USER_AGENT']来获取User-Agent信息。如果访问者的User-Agent信息不在白名单中,则可以拒绝访问
* 检查HTTP_USER_AGENT是否在白名单中,检测通过,则继续执行代码,检测不通过,则终止执行
* 注意:User-Agent可以被客户端修改,因此不应单独依赖此方法进行安全控制
* @param mixed 如果检测通过,则返回true;否则终止执行
*/
public static function checkHttpUserAgent()
{
// 定义允许访问的User-Agent白名单,可根据需要在此处添加更多的User-Agent条目
$whitelist = [
// 谷歌浏览器
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
// Microsoft Edge浏览器
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
];
// 获取当前请求的User-Agent信息
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
// 检查当前User-Agent是否存在于白名单中,如果User-Agent不在白名单中,发送403 Forbidden响应并终止脚本
if (!in_array($userAgent, $whitelist)) {
header("HTTP/1.1 403 Forbidden");
exit();
}
return true;
}
// -----------------------------------------------------------------【方案二】使用随机码----------------------------------------------------------------------------
/**
* 生成随机码
* 随机码是一种常见的反爬虫方法,这种方法可以有效地避免机器人进行恶意操作
* @param string $random_code_name 系统随机码名称
* @param string $random_code_length 随机码长度
* @param int $expire_time 有效时间
* @return string 随机码
*/
public static function createRandomCode($random_code_name, $random_code_length = 100, $expire_time = 60)
{
// 字符集包括大写字母和数字,可以根据需要调整
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwsyz';
$code = '';
$length = $random_code_length;
// 使用微秒级的时间戳作为随机数种子
mt_srand((double)microtime() * 1000000);
for ($i = 0; $i < $length; $i++) {
// 随机选择字符
$code .= $characters[mt_rand(0, strlen($characters) - 1)];
}
cache($random_code_name, $code, $expire_time);
return cache($random_code_name);
}
/**
* 检测随机码
* @param string $random_code_name 系统随机码名称
* @param string $web_random_code 网站随机码
* @return mixed 如果系统随机码和网站随机码相等,则返回true; 如果系统随机码和网站随机码不相等,则终止执行
*/
public static function checkRandomCode($random_code_name, $web_random_code)
{
if (empty($random_code_name) || empty($web_random_code)) {
header("HTTP/1.1 403 Forbidden");
exit();
}
// 获取随机码
$system_random_code = cache($random_code_name);
// 检测随机码是否存在,若不存在,则生成随机码
if (empty($system_random_code) || $system_random_code == false) {
$system_random_code = self::createRandomCode($random_code_name, 100);
}
// 比较随机码
if ($system_random_code != $web_random_code) {
header("HTTP/1.1 403 Forbidden");
exit();
}
return true;
}
// -----------------------------------------------------------------【方案三】限制访问频率----------------------------------------------------------------------------
/**
* 限制访问频率
* 如果某个IP地址在短时间内多次访问同一页面,很可能是机器人在进行爬虫。可以通过设置访问频率限制来防止这种情况的发生
* @param int $interval_time 访问间隔时间
* @return mixed 如果时间差小于设定的访问间隔,则返回true; 否则,则终止执行
*/
public static function hasTooManyRequests($interval_time)
{
// 检查缓存中是否存在'last_visit_time'变量,如果不存在,则设置为当前时间
if (empty(cache('last_visit_time'))) {
cache('last_visit_time', time());
} else {
// 计算自上次访问以来的时间差。
$time_diff = time() - cache('last_visit_time');
// 如果时间差小于设定的访问间隔($interval_time)
if ($time_diff < $interval_time) {
header("HTTP/1.1 429 Too Many Requests"); // 返回HTTP状态码429表示"Too Many Requests"。
exit(); // 终止脚本执行。
}
// 更新最后访问时间为当前时间
cache('last_visit_time', time());
}
return true;
}
// -----------------------------------------------------------------【方案四】使用IP白名单----------------------------------------------------------------------------
/**
* 检查使用IP白名单
* 如果某些IP地址是可信的,可以将这些IP地址加入到白名单中。当访问者的IP地址不在白名单中时,可以拒绝访问
* @param array $whitelist IP白名单数组
* @return mixed 如果客户端IP在白名单中,则返回true; 否则,则终止执行
*/
public static function IpWhiteList($whitelist)
{
if (!in_array($_SERVER['REMOTE_ADDR'], $whitelist)) {
header("HTTP/1.1 403 Forbidden");
exit();
}
return true;
}
}
防攻击类
相关推荐
-
生成图片
from PIL import Image, ImageColor, ImageDraw, ImageFont, ImageFilterdef create_image_with_text(size, color, text, font_path, font_size, text_color, shadow_color, output_path): """ Create a new image of specified size and color with centered text that has a border and shadow. :param size: A tuple con
-
获取指定目录下的所有图片信息
1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (
-
Thinkphp各版本的PHP要求
ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3