PHP地址怎么防止盗用?有哪些实用的防盗用技术与策略

来源:IPIPP.com作者:缅甸程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《PHP地址怎么防止盗用?有哪些实用的防盗用技术与策略》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP地址怎么防止盗用?有哪些实用的防盗用技术与策略》有用,将其分享出去将是对创作者最好的鼓励。

PHP地址被盗用通常指站点的静态资源、接口地址等被非授权站点或用户直接调用,导致带宽浪费、资源泄露甚至数据安全风险。要解决这类问题,需要结合请求特征校验、权限控制、时效性验证等多种策略,从请求入口拦截非法访问。

PHP地址怎么防止盗用?有哪些实用的防盗用技术与策略

一、验证请求来源:防盗链基础策略

盗用地址的请求通常会携带来源信息,通过校验HTTP请求头中的Referer字段,可以初步判断请求是否来自授权站点。不过要注意Referer可以被伪造,因此该策略适合作为基础防护,不能单独作为唯一验证手段。

实现逻辑:获取请求的Referer值,判断是否在允许的域名白名单中,不在则返回403禁止访问。

<?php
// 允许的请求来源域名白名单
$allowReferer = [
    'www.yoursite.com',
    'yoursite.com'
];

// 获取请求头中的Referer
$referer = $_SERVER['HTTP_REFERER'] ?? '';

// 如果Referer为空或者不在白名单中,返回403
if (empty($referer)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access Denied');
}

// 解析Referer的域名
$refererHost = parse_url($referer, PHP_URL_HOST);
if (!in_array($refererHost, $allowReferer)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access Denied');
}

// 验证通过,正常返回资源
// 这里可以写返回图片、文件等资源的逻辑
?>

二、生成时效性访问令牌

给资源地址附加有时效性的令牌,只有携带合法令牌的请求才能访问资源,令牌过期后自动失效,能有效防止地址被长期盗用。令牌可以结合时间戳、资源标识、密钥生成,通过签名校验合法性。

实现步骤:1. 生成令牌时拼接资源ID、过期时间戳、密钥,计算签名;2. 请求时校验令牌签名、判断是否过期;3. 过期或签名错误则拒绝访问。

<?php
// 令牌生成密钥,建议存在配置文件里不要硬编码
$tokenSecret = 'your_secret_key_123456';

// 生成资源访问令牌的函数
function generateResourceToken($resourceId, $expireSeconds = 300) {
    global $tokenSecret;
    $expireTime = time() + $expireSeconds;
    // 拼接签名字符串:资源ID+过期时间+密钥
    $signStr = $resourceId . $expireTime . $tokenSecret;
    $sign = md5($signStr);
    // 返回令牌:资源ID_过期时间_签名
    return $resourceId . '_' . $expireTime . '_' . $sign;
}

// 校验资源访问令牌的函数
function verifyResourceToken($token) {
    global $tokenSecret;
    // 拆分令牌
    $tokenArr = explode('_', $token);
    if (count($tokenArr) != 3) {
        return false;
    }
    list($resourceId, $expireTime, $sign) = $tokenArr;
    // 校验是否过期
    if (time() > $expireTime) {
        return false;
    }
    // 重新计算签名校验
    $checkSign = md5($resourceId . $expireTime . $tokenSecret);
    if ($checkSign != $sign) {
        return false;
    }
    return $resourceId;
}

// 使用示例:访问资源时校验令牌
$token = $_GET['token'] ?? '';
$resourceId = verifyResourceToken($token);
if (!$resourceId) {
    header('HTTP/1.1 403 Forbidden');
    exit('Token Invalid Or Expired');
}

// 令牌校验通过,返回对应资源
echo 'Resource ' . $resourceId . ' content';
?>

三、限制请求频率与IP访问控制

盗用地址的请求通常会有较高的请求频率,结合请求频率限制和IP黑名单,可以进一步拦截批量盗用的行为。可以使用Redis记录IP的请求次数,超过阈值则暂时封禁。

<?php
// 连接Redis,需要提前安装Redis扩展并启动Redis服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$clientIp = $_SERVER['REMOTE_ADDR'];
// 每个IP每分钟最多允许10次请求,可根据资源类型调整
$limit = 10;
$expire = 60;

// 获取当前IP的请求次数
$requestCount = $redis->get('request_limit:' . $clientIp);
if ($requestCount >= $limit) {
    header('HTTP/1.1 403 Forbidden');
    exit('Request Too Frequent');
}

// 计数递增,第一次访问设置过期时间
if (!$requestCount) {
    $redis->set('request_limit:' . $clientIp, 1, $expire);
} else {
    $redis->incr('request_limit:' . $clientIp);
}

// 频率校验通过,继续后续逻辑
?>

四、结合用户身份校验

如果资源仅对登录用户开放,还可以在地址访问时校验用户登录状态,未登录用户直接拒绝访问。可以结合Session或者JWT令牌校验用户身份。

<?php
session_start();

// 校验用户是否登录
if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])) {
    header('HTTP/1.1 401 Unauthorized');
    exit('Please Login First');
}

// 登录用户校验通过,返回资源
?>

五、策略组合建议

单一防护策略容易被绕过,建议根据实际场景组合使用:公开资源可以组合Referer校验+时效性令牌+频率限制;私有资源可以额外加上用户身份校验。同时要注意定期更新密钥、调整频率阈值,避免误拦截正常用户请求。

防护策略适用场景防护强度
Referer校验公开静态资源
时效性令牌所有资源地址
频率限制+IP封禁高访问量资源
用户身份校验私有付费资源

以上策略可以根据站点需求灵活调整,核心思路是让盗用者无法获取长期有效的访问地址,同时尽可能降低对正常用户的影响。

PHP地址防盗用防盗链请求验证访问控制修改时间:2026-06-07 01:35:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。