首页 > 解决方案 > 限制没有变量的页面,仅在来自页面或站点时打开

问题描述

page-one.php 代码

<?php
//page-one.php
session_start();
$_SESSION['page_one'] = time();
?>
hello this is page 1 go to page 2

<a href="www.domain.com/page-two.php">Page 2</a>

page-two.php 代码

<?php
//page-two.php
session_start();

//Check to see if session variable exists.
if(!isset($_SESSION['page_one'])){
    //Does not exist. Redirect user back to page-one.php
    header('Location: 404.php');
    exit;
} ?>

this is page 2

工作完美,但我有两个问题:

  1. 如果我删除第一页 bcz 我想通过单击链接向访问第 2 页的所有访问者显示第 2 页怎么办

  2. 或者如果用户通过 google.com 进入第二页怎么办,在这种情况下,第二页将如何传递 page_one 变量

标签: phphttp-status-code-404

解决方案


这没有多大意义,但对于您的具体问题:

if(!isset($_SESSION['page_one']) &&
   strpos($_SERVER['HTTP_REFERER'], 'google') === false &&
   strpos($_SERVER['HTTP_X_FORWARDED_FOR'], 'google') === false &&
   file_exists('page-one.php')
{
    header('Location: 404.php');
    exit;
}
  • 检查会话变量是否未设置
  • 检查是否HTTP_REFERER不是google
  • 检查是否HTTP_X_FORWARDED_FOR不是google
  • 检查是否page-one.php未被删除

$_SERVER['HTTP_REFERER']不可靠,因为它可能是错误的,代理服务器或空的,并且$_SERVER['HTTP_X_FORWARDED_FOR']不保证设置或可靠。

考虑到前面的注意事项,您可以通过检查以下内容来查看某人是否来自另一个站点:

if(!isset($_SESSION['page_one'] &&
   !isset($_SERVER['HTTP_REFERER'] &&
   !isset($_SERVER['HTTP_X_FORWARDED_FOR'])
{
    header('Location: 404.php');
    exit;
}

如果您向所有链接添加 get 参数,则更容易:

<a href="www.domain.com/page-two.php?link">Page 2</a>

然后:

if(!isset($_SESSION['page_one'] && !isset($_GET['link'))
{
    header('Location: 404.php');
    exit;
}

推荐阅读