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

2023-12-13 04:57:25

1. 检查IP是否在黑名单中,如果是则终止访问。
2. 检查手机号是否在黑名单中,如果是则终止访问。
3. 对于同一个IP,限制访问次数,如果超过限制则终止访问。
4. 对于同一个手机号,限制访问次数,如果超过限制则终止访问。
5. 检查IP是否为海外IP,如果是则终止访问。
6. 如果通过所有限制条件,调用send函数发送短信。

apis.map.qq.com

?腾讯地图官网

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

<?php
session_start();

// 黑名单IP列表
$blacklistIP = ['127.0.0.1'];

// 黑名单手机号列表
$blacklistTel = ['18888888888'];

// IP访问限制次数
$limitIP = 10;

// 手机号访问限制次数
$limitTel = 10;

// 检查IP是否在黑名单中
$ip = getip();
if (in_array($ip, $blacklistIP)) {
    die('非法访问');
}

// 检查手机号是否在黑名单中
$tel = $_GET['tel'];
if (in_array($tel, $blacklistTel)) {
    die('非法访问!');
}

// 检查IP访问次数
if (isset($_SESSION['ipNum']) && $_SESSION['ipNum'] > $limitIP - 1) {
    die('访问太频繁!');
}

// 检查手机号访问次数
if (isset($_SESSION['telNum']) && $_SESSION['telNum'] > $limitTel - 1) {
    die('访问太频繁!');
}

// 检查海外IP
if (!iszgip($ip)) {
    die('访问太频繁!!!');
}

// 发送短信
send();

function send()
{
    if (isset($_SESSION['ipNum'])) {
        ++$_SESSION['ipNum'];
    } else {
        $_SESSION['ipNum'] = 1;
    }
    if (isset($_SESSION['telNum'])) {
        ++$_SESSION['telNum'];
    } else {
        $_SESSION['telNum'] = 1;
    }
    echo '发送成功';
}

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';
    }
}

function iszgip($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;
}
?>

这段代码实现了一些简单的访问限制,可以提供一定程度的防护。以下是该代码的优点和缺点:

优点:
1. 黑名单功能:可以将指定的IP地址或手机号添加到黑名单,从而禁止其访问。
2. 访问次数限制:对于同一个IP地址或手机号,可以限制其访问次数,避免频繁访问或滥用。
3. 检查海外IP:通过调用腾讯地图API,可以判断访问者的IP是否属于中国境内,从而禁止海外IP的访问。

缺点:
1. 黑名单功能仅针对预先设置的IP地址和手机号,无法应对新出现的恶意IP或手机号。
2. 访问次数限制使用了基于Session的计数器,这意味着计数器是与用户的Session绑定的。如果用户清除了Session或使用多个不同的会话,该限制将无效。
3. 检查海外IP功能依赖于腾讯地图API的可用性和准确性。如果API出现问题或返回的地理位置信息不准确,可能会导致错误的判断结果。

请注意,这段代码仅提供了一种简单的防护措施,无法完全保护应用程序免受所有攻击。在实际应用中,建议结合其他安全措施,如使用防火墙、Web应用程序防护(WAF)等来增强安全性。此外,及时更新代码和及时监测安全事件也是保护应用程序安全的重要措施。

文章来源:https://blog.csdn.net/weixin_39934453/article/details/134798885
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。