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

PHP如何实现禁止URL直接访问页面 仅允许按钮跳转访问

PHP实现禁止URL直接访问、仅允许按钮跳转访问的方案

没有绝对无法绕过的访问拦截逻辑,但以下两种方案完全满足大学课程项目的需求,普通用户直接在地址栏输入URL访问会被直接拦截。


方案1:会话Token校验(优先选用,稳定性最好)

核心逻辑:在放置跳转按钮的源页面生成一次性随机校验令牌,存入PHP会话,用户点击按钮跳转时携带该令牌,目标页面校验令牌匹配才允许访问,直接输入URL无法携带正确的有效令牌,会被拦截。

代码实现

  1. 放置按钮的源页面(命名为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>
  1. 目标页面(把原来的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:54:37