【问题标题】:How to use $_SERVER['HTTP_REFERER'] correctly in php?如何在 php 中正确使用 $_SERVER['HTTP_REFERER']?
【发布时间】:2016-07-14 09:39:07
【问题描述】:

假设我有两个页面 page1.phppage2.php 并且我希望 page2.php 仅在它被重定向形式 page1.php 并且我将此代码插入到 page2.php 时才显示

if($_SERVER['HTTP_REFERER'] == "page1.php")
{
    //keep displaying page2.php
}else{
    //if it is not redirected from page1.php
    header('Location:page1.php')
    //redirect the user back to page1.php 
}

这段代码运行良好,直到我在page2.php 上有一个表单和一个提交按钮,当单击提交按钮时页面刷新,这意味着HTTP_REFERER 将更改为page2.php,所以我的if statement 失败并且需要我回到page1.php 我不希望这种情况发生。有什么办法可以防止这种情况发生吗?

提前致谢。

【问题讨论】:

  • referer 是用户提供的值,不应依赖它,因为它可以被操纵或省略。而是使用会话,在 page1.php 上设置会话变量并在 page2.php 上检查它。
  • @CharlesAddis 我添加了代码,但似乎没有任何改变。

标签: php redirect http-referer


【解决方案1】:

我不建议使用HTTP_REFERER

  1. 在浏览器中操作相当简单。

  2. 某些用户可能在其浏览器中进行了安全设置,根本不发送此标头。

  3. 无法通过HTTPS访问。

  4. 一些代理会从请求中去除此标头

  5. 已添加 - 请参阅this quesion的回复


正如 Charlotte Dunois 在评论中所说,最好在发送表单之前设置会话值,然后在第 2 页进行检查。

page1.php:

$_SESSION[ 'display_page2' ] = TRUE;
//rest of the content

page2.php:

if ( (isset( $_SESSION[ 'display_page2' ] ) && $_SESSION[ 'display_page2' ] === TRUE ) || isset( $_POST[ 'some_form_input' ] ) ) {
  //keep displaying page2.php
} else {
  header('Location:page1.php');
  exit;
}

使用isset( $_POST[ 'some_form_input' ] ),您可以检查表单是否已发送(通过POST方法)。

如果需要,您可以使用unset( $_SESSION[ 'display_page2' ] ); 取消设置会话或将其设置为不同的值。

【讨论】:

  • 添加 or 运算符并不能解决问题,如果用户使用 url 获取 page2.php,它将允许用户
  • 仍然可以通过 HTTPS 访问referer。
【解决方案2】:
<?php
if(($_SERVER['HTTP_REFERER'] == "page1.php") || (isset($_POST['submit']) && $_SERVER['HTTP_REFERER']=="page2.php"))
{
    //keep displaying page2.php
}else{
    //if it is not redirected from page1.php
    header('Location:page1.php');
    //redirect the user back to page1.php 
}

?>

如果referrer 不是第1 页,您可以检查referrer = page2 和post 是否已提交的条件。 或者检查referrer是page1还是post提交。 这是避免您的问题的一种可能性。

【讨论】:

    【解决方案3】:

    我建议不要使用$_SERVER['HTTP_REFERER'],因为它很容易被欺骗。

    相反,您可以在他们加载第 1 页时使用setcookie("page1", 1); 输出任何标记之前设置cookie。然后在第 2 页使用

    检查它
    if(isset($_COOKIE['page1']))
    {
        //keep displaying page2.php
    }else{
        //if it is not redirected from page1.php
        header('Location:page1.php')
        //redirect the user back to page1.php 
    }
    

    通过不指定到期日期,cookie 将在浏览器关闭时到期。在这种情况下,使用 cookie 也会使代码对其他人更具可读性。

    【讨论】:

    • 这正是我建议的方法,surafel。使用 cookie 可以获得更好的结果,并且可以以多种不同的方式使用它!查看w3schools.com/php/func_http_setcookie.asp 获取基本示例。
    • @jarmerson 请将 php.net 文档页面链接到 setcookie 而不是 w3fools
    • @Cha 我已经有了,他只是在帮助别人找到另一个例子。官方的并不总是那么有用。
    【解决方案4】:
    <?php
    
    /* 
        this page allows links from the following pages
    
        public.php?id=links
        private.php?id=links
    
    don't allow if visitors come from anywhere else
    
    this example would only work if I used the entire URL in the 'if' statement 
    */
    
    $referringpage = $_SERVER['HTTP_REFERER'];
    
    if ( $referringpage == "http://www.example.com/public.php?id=links" ) {
    $pass = "yes";
    } elseif ( $referringpage == "http://www.example.com/private.php?id=links" ) {
    $pass = "yes";
    } else {
    $pass = "no";
    }
    
    
    if ( $pass == "yes" ) {
    // do the function this page was made to do
    } 
    
    header( "Location: http://www.example.com/public.php?id=links" );
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 2012-09-27
      • 1970-01-01
      • 2012-04-13
      • 2020-03-29
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多