You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP获取URL参数?下载链接防盗链及过期验证问题求助

解决下载链接防盗链与过期验证的参数获取问题

嘿,我来帮你搞定这个问题!你现在遇到的错误和验证失败,核心是参数传递逻辑错配,再加上几个小细节处理不当,咱们一步步理清楚:

问题根源拆解

  1. 参数传递搞反了:你在index.php里把生成的完整下载URL塞进了bode隐藏字段,提交到download.php后,s和t参数是藏在$_GET['bode']这个URL字符串里的,不是直接在当前请求的$_GET数组里,所以download.php自然找不到s和t,报出Undefined index错误。
  2. 路径变量错误:download.php里用$_SERVER['REQUEST_URI']作为$path,这会拿到当前请求的URI(比如/example/download.php?bode=xxx),而不是我们要验证的目标文件路径/download/tempfile.zip,直接导致哈希验证不匹配。
  3. 有效期判断逻辑写反:原代码里$timestamp <= time()是错误的——$timestamp是你设置的未来过期时间(当前时间+3600),应该判断当前时间没超过这个过期时间才对。

修正后的完整代码

1. 修正localhost/example/index.php

不用传递完整URL,直接把验证所需的参数单独传给download.php,逻辑更清晰:

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure'; // 记得改成自己的安全盐值
$path = '/download/tempfile.zip';
$timestamp = time() + 3600; // 设置1小时有效期
$hash = md5($salt . $ip . $timestamp . $path);
?>
<form action="download.php" method="get">
<input name="path" type="hidden" value="<?php echo $path; ?>">
<input name="s" type="hidden" value="<?php echo $hash; ?>">
<input name="t" type="hidden" value="<?php echo $timestamp; ?>">
<input type="submit" value="下载文件">
</form>

2. 修正localhost/example/download.php

现在可以直接获取参数,同时修正验证逻辑和补充文件下载代码:

<?php
// 先检查必要参数是否存在,避免Undefined index警告
if(!isset($_GET['path'], $_GET['s'], $_GET['t'])) {
    die('参数缺失,请通过正确渠道获取下载链接');
}

$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure'; // 和index.php里的盐值必须完全一致!
$path = $_GET['path'];
$hashGiven = $_GET['s'];
$timestamp = $_GET['t'];

// 生成验证用的哈希值(和index.php里的拼接顺序必须完全一致!)
$hash = md5($salt . $ip . $timestamp . $path);

// 验证哈希匹配,且当前时间未超过有效期
if($hashGiven === $hash && time() <= $timestamp) {
    // 拼接服务器上的实际文件路径
    $filePath = $_SERVER['DOCUMENT_ROOT'] . $path;
    
    // 检查文件是否存在
    if(file_exists($filePath)) {
        // 设置下载响应头
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
        header('Content-Length: ' . filesize($filePath));
        // 输出文件内容
        readfile($filePath);
        exit;
    } else {
        die('目标文件不存在');
    }
} else {
    die('链接已过期或无效,请重新获取下载链接');
}
?>

关键注意事项

  • 盐值一致性:index.php和download.php里的$salt必须完全相同,否则哈希验证肯定失败。
  • 哈希拼接顺序:生成哈希时的字符串拼接顺序(salt + ip + timestamp + path)在两个文件里必须完全一致,顺序变了哈希值就不一样了。
  • 安全提示:MD5虽然能用,但安全性不算高,后续可以考虑用SHA-256等更安全的哈希算法;另外如果是生产环境,建议把盐值存在配置文件里,不要直接写在代码里。

内容的提问来源于stack exchange,提问作者R.M. Reza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:12:48