PHP如何实现禁止URL直接访问页面 仅允许按钮跳转访问
PHP实现禁止URL直接访问、仅允许按钮跳转访问的方案
没有绝对无法绕过的访问拦截逻辑,但以下两种方案完全满足大学课程项目的需求,普通用户直接在地址栏输入URL访问会被直接拦截。
方案1:会话Token校验(优先选用,稳定性最好)
核心逻辑:在放置跳转按钮的源页面生成一次性随机校验令牌,存入PHP会话,用户点击按钮跳转时携带该令牌,目标页面校验令牌匹配才允许访问,直接输入URL无法携带正确的有效令牌,会被拦截。
代码实现
- 放置按钮的源页面(命名为
index.php,必须为PHP后缀才能运行服务端逻辑):
<?php // 开启会话,必须放在所有输出之前 session_start(); // 生成随机一次性校验token $accessToken = md5(uniqid(mt_rand(), true)); // 把token存入会话 $_SESSION['example_access_token'] = $accessToken; ?> <!-- 页面其他原有内容 --> <button onclick="location.href='example.php?token=<?= $accessToken ?>'">访问目标页面</button>
- 目标页面(把原来的
example.html重命名为example.php,原有HTML内容全部保留,在文件最开头加校验代码):
<?php session_start(); // 校验规则:没传token、或者token和会话中存储的不匹配,直接拒绝 if (empty($_GET['token']) || $_GET['token'] !== $_SESSION['example_access_token']) { // 校验失败,清除失效token unset($_SESSION['example_access_token']); exit("访问被拒:请通过指定页面的按钮跳转访问"); } // 校验通过后立即销毁token,保证每次访问都必须重新点击按钮 unset($_SESSION['example_access_token']); ?> <!-- 以下放原example.html的所有静态内容即可 --> <h1>目标页面内容</h1> <p>只有点击按钮才能正常访问到这里</p>
方案说明
- Token是一次性的,即使用户某次跳转时复制了带Token的完整URL,下次直接输入该地址也无法通过校验
- 校验逻辑全在服务端执行,用户无法通过前端控制台篡改绕过,满足课程项目的安全要求
方案2:来源页校验(实现最简单,适合快速演示)
核心逻辑:通过请求携带的HTTP_REFERER字段判断请求来源,只有来源是本站点的按钮放置页面时才放行,直接输入URL访问时该字段为空,会被拦截。
代码实现
仅需要修改目标页面,在example.php最开头加入以下代码:
<?php // 允许访问的来源页路径,替换为你自己放按钮的页面实际路径 $allowedRefererPath = '/index.php'; if ( empty($_SERVER['HTTP_REFERER']) || parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH) !== $allowedRefererPath ) { exit("访问被拒:请通过指定页面的按钮跳转访问"); } ?> <!-- 以下放原页面静态内容 -->
方案说明
- 代码量最少,不需要修改源页面的跳转逻辑
- 存在兼容问题:部分浏览器默认会禁用REFERER字段传递,可能导致正常点击按钮的用户也被拦截;同时该字段可以通过工具伪造,仅适合临时演示使用,正式交作业优先选方案1
注意事项
- 所有需要执行校验逻辑的页面必须使用
.php后缀,保证服务器能解析PHP代码,纯静态HTML无法运行服务端校验逻辑 - 不要尝试用纯前端JS实现拦截,前端代码用户可以通过浏览器控制台随意修改,非常容易绕过
- 如果需要保留
.html的URL格式,可以通过服务器伪静态规则把对应HTML文件的请求交给PHP解析,课程项目直接修改文件后缀为.php是最简便的方式
内容的提问来源于stack exchange,提问作者Aman kumar
相关产品推荐
相关产品推荐

