PHP短信接口防刷防轰炸多重解决方案三(可正式使用)

短信接口盗刷轰炸:指的是黑客利用非法手段获取短信接口的访问权限,然后使用该接口发送大量垃圾短信给目标用户

短信验证码轰炸解决方案一(验证码类解决)-CSDN博客

短信验证码轰炸解决方案二(防止海外ip、限制ip、限制手机号次数解决)-CSDN博客

PHP短信接口防刷防轰炸多重解决方案如下:

下面用到检查ip方法key可以需要去地图官网获取

腾讯位置服务 - 立足生态,连接未来

这段代码是一个名为SecurityCheck的类,用于进行安全检查。该类包含了多个私有属性和方法,用于对用户的手机号和IP地址进行检查。

该类的主要方法是checkAll(),它接收一个手机号作为参数,并依次调用其他的私有方法来进行不同的检查。checkAll()方法返回一个JSON格式的结果,包含了每个检查的状态和消息,以及整体的状态。

具体的检查步骤如下:

  • 1. 防止Linux服务器访问:检查User-Agent头部,如果包含"Linux"字样,表示是Linux服务器访问,视为非法访问。
  • 2. 手机与IP黑名单:检查手机号和IP地址是否在黑名单中,如果在黑名单中,则视为非法访问。
  • 3. 手机与IP限制次数:检查手机号和IP地址的访问次数是否超过设定的限制次数,如果超过限制次数,则视为访问太频繁。
  • 4. 防止国外IP:检查IP地址是否为国内IP,如果不是国内IP,则视为非法访问。
  • 5.做好错误日志记录
  • 6、补充短信服务商后台限制每天发送次数

session_start();
class SecurityCheck {private $backTel=['18888888888'];//黑名单手机号列表private $backIp=['127.0.0.0'];//黑名单ip列表private $sysMsg=[];       //异常信息,系统内部日志private $logPath='log/';  //日志目录private $limitIP = 10;     //限制ip次数private $limitTel = 10;   //限制手机号次数public function checkAll($tel) {$this->sysMsg[]='校验手机:'.$tel.' ip:'.$this->getIp();$result = [];//1、防止linux服务器访问$result['checkUserAgent'] = $this->checkUserAgent();//2、手机与ip黑名单$result['checkBlacklist'] = $this->checkBlacklist($tel);//3、手机与ip限制次数$result['checkLimit'] = $this->checkLimit();//4、防止国外ip$result['checkOverseasIP'] = $this->checkOverseasIP();$overallStatus = 1;foreach ($result as $checkResult) {if ($checkResult['status'] === 0) {$overallStatus =0;break;}}if($overallStatus==1){$this->sysMsg[]="校验成功";}else{$this->sysMsg[]="校验失败";}$this->w_log( $this->sysMsg);$result['overallStatus'] = $overallStatus;return json_encode($result);}private function checkUserAgent() {$userAgent = $_SERVER['HTTP_USER_AGENT'];if (strpos($userAgent, 'Linux') !== false) {$this->sysMsg[]='非法Linux 服务器访问';return ['status' => 0, 'message' => '非法访问'];}return ['status' =>1, 'message' => '成功'];}private function checkBlacklist($tel) {$result = ['status' => 1, 'message' => '成功'];$ip = $this->getIp();$backIp = $this->backIp;if (in_array($ip, $backIp)) {$this->sysMsg[]=$ip.'非法ip服务器访问';$result['status'] = 0;$result['message'] = '非法访问';}$backTel = $this->backTel;if (in_array($tel, $backTel)) {$this->sysMsg[]=$tel.'非法手机号访问';$result['status'] = 0;$result['message'] = '非法访问!';}return $result;}private function checkLimit() {$result = ['status' =>1, 'message' => '成功'];$limitIP = $this->limitIP;if ($_SESSION['ipNum'] && $_SESSION['ipNum'] > $limitIP-1) {$this->sysMsg[]='ip访问太频繁';$result['status'] =0;$result['message'] = '访问太频繁!';}$limitTel =  $this->limitTel;if ($_SESSION['telNum'] && $_SESSION['telNum'] > $limitTel-1) {$this->sysMsg[]='手机号访问太频繁';$result['status'] = 0;$result['message'] = '访问太频繁!!';}return $result;}private function checkOverseasIP() {$ip = $this->getIp();if (!$this->isChinaIP($ip)) {$this->sysMsg[]='非国内ip';return ['status' => 0, 'message' => '访问太频繁!!!'];}return ['status' => 1, 'message' => '成功'];}private function getIp() {static $ip = '';if (isset($_SERVER['REMOTE_ADDR'])) {$ip = $_SERVER['REMOTE_ADDR'];}if (isset($_SERVER['HTTP_CDN_SRC_IP'])) {$ip = $_SERVER['HTTP_CDN_SRC_IP'];} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {$ip = $_SERVER['HTTP_CLIENT_IP'];} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {foreach ($matches[0] as $xip) {if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {$ip = $xip;break;}}}if (preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $ip)) {return $ip;} else {return '127.0.0.1';}}private function isChinaIP($ip) {$key = 'PHYBZ-UOXWV-LUIPZ-DSADSA-SDSDD-ADSADA';$url = "https://apis.map.qq.com/ws/location/v1/ip?ip=" . $ip . "&key=" . $key;$res = file_get_contents($url);if ($res) {$data = json_decode($res, true);if (isset($data['result']['ad_info']['nation']) && $data['result']['ad_info']['nation'] != "中国") {return false;}}return true;}private function w_log($data) {$root_path=str_replace('\\', '/', dirname(__FILE__));//改成你自己目录$dir = $root_path  . '/'.$this->logPath;if (!is_dir($dir)) {mkdir($dir, 0777, true);}$log_file = $dir . date('Ymd', time()) . '.txt';file_put_contents($log_file, "\r\n", FILE_APPEND);if (is_array($data)) {$data = json_encode($data,JSON_UNESCAPED_UNICODE); // 将数组转换为JSON格式的字符串}file_put_contents($log_file, "/".date("Y-m-d H:i:s")."--".$data, FILE_APPEND);}}
$check=new  SecurityCheck();
echo $check->checkAll($_GET['tel']);sendSMS();
function sendSMS() {//发送短信if ($_SESSION['ipNum']) {++$_SESSION['ipNum'];} else {$_SESSION['ipNum'] = 1;}if ($_SESSION['telNum']) {++$_SESSION['telNum'];} else {$_SESSION['telNum'] = 1;}//添加自己的发送验证码接口//添加自己的发送验证码接口return ['status' => 1, 'message' => '发送成功'];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213544.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《opencv实用探索·八》图像模糊之均值滤波、高斯滤波的简单理解

1、前言 什么是噪声? 该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素&am…

Fiddler抓包模拟器(雷电模拟器)

Fiddler设置 List item 打开fiddler,的options 点击OK,重启fiddler 模拟器 更改网络设置 IP可以在电脑上终端上查看 然后在模拟器浏览器中输入IP:端口 安装证书

[二分查找双指针]LeetCode881: 救生艇

救生艇 作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本文涉及的基础知识点 二分查找算法合集 题目 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&am…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e − s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

QT作业2

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为…

【Flink系列三】数据流图和任务链计算方式

上文介绍了如何计算并行度和slot的数量,本文介绍Flink代码提交后,如何生成计算的DAG数据流图。 程序和数据流图 所有的Flink程序都是由三部分组成的:Source、Transformation和Sink。Source负责读取数据源,Transformation利用各种…

Linux各目录结构说明

文章目录 目录说明源码放哪里?拓展:Linux里面安装软件是装在home目录还是opt目录还是/usr/local好? bin boot dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var 目录说明 bin 存放二进制可执行文件&…

《Spring Cloud Alibaba 从入门到实战》分布式配置

分布式配置 1、简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。 Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,在特殊的 bootstrap 阶段,…

2023.12.4 关于 Spring Boot 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易,通…

机器学习之无监督学习:九大聚类算法

今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 在无监督学习中,我们的数据并不带有任何标签,因此在无监督学习中要做的就是将这一系列无标签的数…

Python实现PDF-Excel

轻松解决PDF格式转Excel(使用python实现) 实现思路: 要将PDF转换为Excel,可以使用以下步骤: 解析PDF内容:首先,需要使用Python中的第三方库(如PyPDF2、pdfminer等)来解…

Ribbon 饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…

数据结构之插入排序

目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中,我们不经意间会遇到很多排序的场景,比如在某宝,某东上买东西,我们可以自己自定义价格是由高到低还是由低到高,再比如在王者某…

修改移远提供的GobiNet、quectel-CM源码,使其支持有方N720 4G模块

最近在研究imx6ull linux下4G模块驱动的移植,参考的移远ec20的移植方法,添加了GobiNet驱动,编译了quectel-CM工具,并且可以正常拨号,分配到ip,如下: ping外网也没有压力,如下…

Qt12.8

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为…

使用Pytorch实现Grad-CAM并绘制热力图

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 看一下这个main cnn.py的文件 那这里我为了方便 就直接从官方的torch vision这个库当中导入一些我们常用的model 比如说我这里的例子是采用的mobile net v3 large这个模型 然后这里我将pretrain设…

openEuler 20.03 (LTS-SP2) aarch64 cephadm 部署ceph18.2.0【1】离线部署 准备基础环境

准备3台虚拟机服务器(均可访问公网) 10.2.1.176 (作为操作机) 10.2.1.191 10.2.1.219 安装基础工具 yum install -y vim 配置hosts 编辑/etc/hosts,添加 10.2.1.176 ceph-176 10.2.1.191 ceph-191 10.2.1.219 ceph-219 配置免密登录…

JVM 执行引擎篇

机器码、指令、汇编语言 机器码 各种用二进制编码方式表示的指令,叫做机器指令码。开始,人们就用它采编写程序,这就是机器语言。机器语言虽然能够被计算机理解和接受,但和人们的语言差别太大,不易被人们理解和记忆&a…

【MySQL语言汇总[DQL,DDL,DCL,DML]以及使用python连接数据库进行其他操作】

MySQL语言汇总[DQL,DDL,DCL,DML] SQL分类1.DDL:操作数据库,表创建 删除 查询 修改对数据库的操作对表的操作复制表(重点)!!!!! 2.DML:增删改表中数据3.DQL:查询表中的记录…

HLS实现图像膨胀和腐蚀运算--xf_dilation和xf_erosion

一、图像膨胀和图像腐蚀概念 我们先定义,需要处理的图片为二值化图像A。图片的背景色为黑色,即像素值为0。图片的目标色为白色,即像素值为1。 再定义一个结构元S,结构元范围内所有的像素为白色,像素值为1。 1、图像的…