无法在Session中保存初始HTTP_REFERER的技术求助
问题分析与解决方案
你的核心问题是每次请求都会覆盖$_SESSION['originalref']的值:当用户从domain.com进入第一个页面时,session里正确保存了domain.com;但跳转到站内其他页面时,当前的HTTP_REFERER变成了本站域名,代码又把session里的原始来源替换成了本站域名,导致后续的权限判断失败。
咱们只需要调整逻辑,仅在用户第一次访问(session中没有原始来源记录)时,才保存初始的HTTP_REFERER,之后不再更新这个session值即可。
修改后的完整代码
<?php // Start the session if (session_status() == PHP_SESSION_NONE) { session_start(); } ?> <?php // Getting referer and saving - 仅在session无原始来源时设置 $server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $referer = parse_url($server); $refererhost = isset($referer['host']) ? $referer['host'] : ''; // 关键改动:只有session中没有originalref时才赋值,避免后续跳转覆盖 if (!isset($_SESSION['originalref'])) { $_SESSION['originalref'] = $refererhost; } ?> <?php if ($_SESSION['originalref'] == 'domain.com'): ?> <!doctype html> <html> <head> </head> <body> <p>Allowed.</p> </body> </html> <?php else: ?> <!doctype html> <html> <head> </head> <body> <p>Not allowed. Debug: <?= $_SESSION['originalref'] ?></p> </body> </html> <?php endif; ?>
额外说明
- 如果用户是直接输入网址访问(没有HTTP_REFERER),
$_SESSION['originalref']会是空字符串,这时候会触发“Not allowed”。如果你想允许直接访问,可以在判断里添加额外条件,比如:<?php if ($_SESSION['originalref'] == 'domain.com' || empty($_SESSION['originalref'])): ?> - 你已经明确知晓
HTTP_REFERER可被伪造且当前机制符合需求,这个逻辑就能完美解决站内跳转被拦截的问题。
内容的提问来源于stack exchange,提问作者JudgeB
相关产品推荐
相关产品推荐

