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

news2024/11/23 6:38:47

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

短信验证码轰炸解决方案一(验证码类解决)-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.coloradmin.cn/o/1288401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 数组方法 reduce() 的用法

一、概述 在JavaScript中,reduce()方法是一个非常实用的数组方法,它接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。这个方法在处理数组…

数据结构 | 二叉树的各种遍历

数据结构 | 二叉树的各种遍历 文章目录 数据结构 | 二叉树的各种遍历创建节点 && 创建树二叉树的前中后序遍历二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树查找值为x的节点二叉树求树的高度二叉树的层序遍历判断二叉树是否是完全二叉树 我们本章来实现二…

【C语言】指针与数组的潜在联系

目录 前言 改变固有数组的平面思维 注意: 数组操作与指针等价 指针数组 数组指针 笔试加深理解: 解析: 前言 《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解: “在C语言中,指针与数组这两个概念…

MUC\GD32低功耗模式简介

 前言 低功耗模式在现在的开发中尤为重要,特别是在使用电池的设备中,今天我们就拿GD32来聊一聊低功耗模式,以及他们使用的状态与唤醒方式以及耗电情况。 GD32支持的低功耗模式:  省电模式 MCU支持三种省电模式&#xff0…

SpringBoot3-创建自定义启动器,使用自定义starter启动器

1、创建自定义启动工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

647. Palindromic Substrings 516. Longest Palindromic Subsequence

647. Palindromic Substrings Given a string s, return the number of palindromic substrings 回文子串 in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. nomal: …

Hello World!

一、minist数据集 深度学习编程特有的hello world程序&#xff1a;采用minist数据集完成意向特定深度学习项目 1、minist数据集介绍 MNIST数据集是一个广泛使用的手写数字识别数据集&#xff0c;它包含了许多不同人手写的数字图片。这个数据集被广泛用于研究手写数字识别&…

文件上传漏洞(带实例)

漏洞介绍&#xff1a; 现代互联网的Web应用程序中&#xff0c;上传文件是一种常见的功能&#xff0c;因为它有助于提高业务效率&#xff0c;如企业的OA系统&#xff0c;允许用户上传图片&#xff0c;视频&#xff0c;头像和许多其他类型的文件。然而向用户提供的功能越多&#…

海外服务器和国内服务器有什么样的区别呢

海外服务器和国内服务器有什么样的区别呢&#xff0c;其实呢在外形方面是大同小异&#xff0c;除了外形还有一些其他方面还存在这一些差异。 一&#xff0c;地理位置的差异。 海外服务器——有可能在中国数据中心之外的任何国家地区&#xff0c;例如美国服务器&#xff0c;韩…

深度解析IP应用场景API:提升风险控制与反欺诈能力

前言 在当今数字化时代&#xff0c;网络安全和用户数据保护成为企业日益关注的焦点。IP应用场景API作为一种强大的工具&#xff0c;不仅能够在线调用接口获取IP场景属性&#xff0c;而且具备识别IP真人度的能力&#xff0c;为企业提供了卓越的风险控制和反欺诈业务能力。本文将…

企业如何结合数字化技术实现精益生产

企业要想长远良性发展&#xff0c;就必须不断追求生产效率的极致&#xff0c;才能不断对抗各方各面带来的压力。结合国家大环境趋势&#xff0c;绿色生产已然成为了国家关注的重点&#xff0c;所以老旧耗能的企业生产模式注定会被时代所淘汰。企业只有紧跟国家的发展步伐&#…

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】

集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

ExoPlayer架构详解与源码分析(10)——H264Reader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

VSC改造MD编辑器及图床方案分享

VSC改造MD编辑器及图床方案分享 用了那么多md编辑器&#xff0c;到头来还是觉得VSC最好用。这次就来分享一下我的blog文件编辑流吧。 这篇文章包括&#xff1a;VSC下md功能扩展插件推荐、图床方案、blog文章管理方案 VSC插件 Markdown All in One Markdown Image - 粘粘图片…

前端路由(front-end routing)和后端路由(back-end routing)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

静态HTTP和动态HTTP有什么区别

静态HTTP是指网页内容在服务器上以静态文件的形式存在&#xff0c;每个页面都是固定的&#xff0c;不能根据用户的操作或输入进行改变。当用户请求一个静态页面时&#xff0c;服务器直接将页面的HTML代码返回给用户的浏览器进行显示。静态HTTP服务器的主要优点是速度快、简单易…

Unity 下载网络图片的方法,并把图片赋值给UI和物体的方法

Unity 下载网络图片的方法&#xff0c;可使用WWW类或UnityWebRequest类&#xff0c;其中UnityWebRequest是新版的方法。 通常我们下载图片都会转成Texture&#xff0c;然后赋值给UI或者物体。 具体实现方法&#xff1a; using System.Collections; using System.Collections…

TA-Lib学习研究笔记(九)——Pattern Recognition (6)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;6&#xff09; 最全面的形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是o…

手机怎么录屏?实用技巧,轻松录制!

手机录屏功能在现代通信和创作中扮演着重要的角色。无论是分享游戏过程、演示手机操作&#xff0c;还是创作教程视频&#xff0c;手机录屏成为了用户不可或缺的工具。本文将深入研究手机怎么录屏的三种方法&#xff0c;通过详细的步骤介绍&#xff0c;帮助用户轻松掌握手机录屏…