如何用PHP获取URL参数?下载链接防盗链及过期验证问题求助
解决下载链接防盗链与过期验证的参数获取问题
嘿,我来帮你搞定这个问题!你现在遇到的错误和验证失败,核心是参数传递逻辑错配,再加上几个小细节处理不当,咱们一步步理清楚:
问题根源拆解
- 参数传递搞反了:你在
index.php里把生成的完整下载URL塞进了bode隐藏字段,提交到download.php后,s和t参数是藏在$_GET['bode']这个URL字符串里的,不是直接在当前请求的$_GET数组里,所以download.php自然找不到s和t,报出Undefined index错误。 - 路径变量错误:
download.php里用$_SERVER['REQUEST_URI']作为$path,这会拿到当前请求的URI(比如/example/download.php?bode=xxx),而不是我们要验证的目标文件路径/download/tempfile.zip,直接导致哈希验证不匹配。 - 有效期判断逻辑写反:原代码里
$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
相关产品推荐
相关产品推荐

