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' => '发送成功'];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐几款转换视频格式的好用转换工具,小白也能上手

视频格式转换工具是一种专门转换视频的软件,可让你将一种视频格式转换为另一种视频格式(例如,MOV 到 MP4),通常可以节省空间。 本文将介绍一些用于转换视频格式的好用转换工具,并且详细描述了它们的主要功…

【FPGA】数字电路设计基础

数字电路基础 1 什么是数字电路 在学习数字电路之前,我们先要了解下什么是数字电路。想要搞明白数字电路,就要搞明白生活中有 两种概念, 数字信号和模拟信号,模拟信号一般包括压力、气温、速度等信号,模拟量的值是可…

智能成绩表 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题目描述 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗? 输入描述 第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10 第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文…

这书看着贼得劲儿

作者呕心沥血2年&#xff0c;再出力作~~~ 给大家推荐一本好玩的书 神经网络与TensorFlow 本来以为出版了第一本书&#xff0c;应该对于漫长的审核有免疫力了&#xff0c;结果又被这本书折磨了2年。于是作者痛定思痛&#xff0c;决定第三本书写一本纯科普的书籍。 墙裂推荐 这…

跨境电商危机公关:应对负面舆情的策略优化

随着跨境电商的快速发展&#xff0c;企业在全球市场中面临的竞争与挑战也日益复杂。在这个数字时代&#xff0c;负面舆情一旦爆发&#xff0c;可能对企业形象和经营造成深远影响。 因此&#xff0c;跨境电商企业需要建立有效的危机公关策略&#xff0c;以迅速、果断、有效地应…

Python集合魔法:解锁数据去重技巧

. 在Python编程的魔法世界中&#xff0c;有一种数据类型几乎被忽视&#xff0c;但却拥有强大的超能力&#xff0c;那就是集合&#xff08;Set&#xff09;。 集合是一种无序、唯一的数据类型&#xff0c;它以其独特的特点在编程世界中独占一席之地。 1. 集合的定义和特点 集…

Quantlib环境安装踩坑记录

1.conda 安装python3.7环境&#xff1b; 2.因为torch1.8.2环境已经被弃用&#xff0c;所以通过nvidia-smi命令确认cuda版本是11.6后进入环境&#xff0c; 输入pip install torch1.12.0cu116 torchvision0.13.0cu116 torchaudio0.12.0 torchtext0.13.0 --extra-index-url https:…

第二证券:股债跷跷板是什么?投资者该如何应对?

股市和债市虽然是两个不同的证券交易商场&#xff0c;但它们之间保持着一定的联系&#xff0c;比较典型的&#xff0c;便是股债商场间的联动&#xff0c;也称为股债跷跷板。股债跷跷板是什么&#xff1f;出资者该怎样应对&#xff1f;关于这些&#xff0c;本文将借用相关知识作…

基于SSM框架的购物商城系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此商城购物信息的…

多屏模式输入法可以正确切换屏幕展示原理剖析

背景 hi&#xff0c;粉丝朋友们&#xff1a; 近期有个学员问到了一个输入法相关问题。刚好梳理了一下输入法相关的在多屏模式的一个展示流程&#xff0c;这里做个记录&#xff0c;也相当于深入理解窗口相关的一篇干货blog。 如上面两幅图展示&#xff0c;输入法可以自由自在显…

从零开始,利用ChatGPT学会写作的完整指南

文章目录 前言了解ChatGPT访问OpenAI平台使用ChatGPT进行简单的对话定义写作主题逐步生成文章段落添加个性化和细节编辑和润色反复修改直至满意 图书推荐内容简介作者简介获取方式 前言 在数字时代&#xff0c;人工智能技术日益成熟&#xff0c;为我们提供了全新的学习和创作机…

使用@Validated注解导致Controller里注入的Service为空

2023年12月7日 今天在写接口参数校验时遇到一个问题&#xff0c;将注解Validated写在Controller上时导致导入的Service为空 Controller代码 Validated RestController RequestMapping("test") public class TestController {Autowiredprivate TestService testServ…

多人相互聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

Python读写txt文件数据

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01; &#x1f…

Java语言中的修饰符

-----------------------------------------------01----------------------------------------------- 类&#xff0c;方法&#xff0c;成员变量和局部变量的可用修饰符 访问控制级别分类&#xff1a; 公开级别&#xff0c;受保护级别&#xff0c;默认级别&#xff0c;私有级…

Java包(package)

1、概念 为了更好的组织类&#xff0c;用于区别类名的命名空间&#xff0c;其实就是基于工程的一个文件路径&#xff0c;如&#xff1a; 2、作用 三个作用&#xff1a; 1&#xff09;区分相同名称的类。 2&#xff09;能够较好地管理大量的类。 3&#xff09;控制访问范围。 在…

讲一下maven的生命周期

Maven是一种强大的项目管理工具&#xff0c;它可以帮助开发者组织和管理项目的构建过程。Maven的生命周期指的是一系列的活动&#xff0c;包括如何创建、准备、构建和测试项目的过程。以下是对Maven生命周期的主要阶段的简要概述&#xff1a; 获取项目&#xff1a;在这个阶段&…

vue2-使用vue-i18n搭建多语言切换环境

安装 注意&#xff1a;vue2.0要用8版本的&#xff0c;使用9版本的会报错 npm install vue-i18n8.27.0 --save 创建相关的语言包文件 在src目录下&#xff0c;新建i18n文件夹 在新文件夹i18n中新建langs文件夹&#xff0c;里边放语言文本文件.js zh.js&#xff1a;存…

html和css写淘宝的快速导航条

目录 1、css代码 2、html代码 1、css代码 <style>* {margin: 0;padding: 0;list-style: none;text-decoration: none;}.nav {width: 900px;height: 40px;background-color: rgb(247, 249, 250);margin: 50px auto;padding-left: 30px;}.nav>li {float: left;width: 1…

ERP和MES的区别与联系,这篇接地气的文章终于讲明白了!

一、ERP和MES之间的“区别” ERP和MES系统在企业管理中都扮演着重要的角色&#xff0c;但它们的功能和职责各有不同。 既然今天要聊ERP和MES的区别&#xff0c;那肯定要给大家讲明白了才行。 所以&#xff0c;这里首先得从工厂的业务模式说起。 作为一个工厂&#xff0c;存…