5秒后重定向但仅允许引荐来源访问页面

时间:2015-06-10 20:56:21

标签: javascript php .htaccess redirect

我试图让page1.php在5秒后重定向到page2.php。但是,page2.php必须是受限制的页面,只有在您从 - >发送时才能查看该页面。如果您在地址栏中手动输入地址,则无法访问mydomain.com/page1.php。

我尝试过使用共享密钥的方法,htaccess和php HTTP_REFERRER。

我认为问题来自重定向,我相信这是因为重定向脚本没有发送HTTP_REFERRER,因此page2.php正在查看从重定向脚本发送的手动输入的URL。我试过一个简单的PHP重定向和JavaScript。以下是我使用过的两个不同的重定向脚本。

php版。

header( "refresh:5;url=page2.php" );

Javascript版本。

<script type="text/javascript">   
function Redirect() 
{  
    window.location="page2.php"; 
} 
setTimeout('Redirect()', 5000);   
</script>

我已尝试使用完整网址和/或不使用http://,例如mydomain.com/page2.php。

Page2.php只需要接受来自page1.php的流量。我不反对如何实现这一目标。只要用户无法手动输入地址并访问该页面,就可以使用共享密钥或任何其他方面。我也完全清楚,推荐人可能会被欺骗,但我没有专业知识可以提升。

2 个答案:

答案 0 :(得分:6)

您可以使用会话数据来确保第2页的用户已通过第1页

通过会话的工作方式,encrypted string非常安全,即使它根本没有加密。

第1页

session_start();
$_SESSION['secret_key'] = 'encrypted_string';
第2页

session_start();
if($_SESSION['secret_key'] == 'encrypted_string'){
   // user is authorized
   echo 'You are authorized to see this page';

}
else{
    echo 'Please visit page1 before accessing this page';

}

// Logic for authorized user

或者,第2页的更短版本:

if(empty($_SESSION['secret_key']) || $_SESSION['secret_key'] != 'encrypted_string'){
   die('You are not authorized to view this page.');
}

echo 'only authorized user will see from here forward';
顺便说一下,在测试时,请记住,一旦设置了会话,您将不得不在浏览器中删除会话,或者使用隐身模式再次进行测试。 要删除Chrome ctrl+shift+delete上的缓存并选择Cookie和其他

答案 1 :(得分:2)

以下是我将如何使用3页进行操作。

在着陆页上,包含您的JavaScript,这会将您重定向到设置会话变量的中间页面,然后重定向到最终页面。

在最后一页上,检查会话变量,确定是否显示页面,然后取消设置会话变量(因此,如果他们再次尝试而不返回第一页,它将不再起作用)。

p1.php

<?php session_start(); ?>
<script type="text/javascript">   
function Redirect() 
{  
     window.location="p12.php"; 
} 
setTimeout('Redirect()', 5000);   
</script>

p12.php

<?php session_start();
$_SESSION['secret'] = 'todays_password';
$newURL = 'p2.php';
header('Location: '.$newURL);
?>

<script type="text/javascript">   
function Redirect() 
{  
     window.location="p2.php"; 
} 
Redirect();   
</script>

p2.php

<?php session_start();

if (isset($_SESSION['secret']))
{
    if ($_SESSION['secret'] == 'todays_password')
    {
        //The user provided the correct secret session variable

        echo 'welcome. you can view this page.';
        //Put all of your page content here
        ?>

        <!-- HTML content should be in between php delimiters, like this-->

        <?php
    }
    else
    {
        //The user supplied a secret code, but it was not the correct one

        echo 'invalid secret.';

        //You can also add code for redirecting the user back to p1 here
        //Or just display an error message
    }
}
else
{
    //The user did not provide a secret session variable -- they most likely did not pass through p12.

    echo 'error, you are unable to view this page';

    //You can also add code for redirecting the user back to p1 here
    //Or just display an error message
}

unset($_SESSION['secret']); //This line makes the user return to p1 every time they visit p2 -- delete this line if you only want them to visit p1 once.
?>

要使此方法安全,您需要为每个用户提供其秘密会话变量的唯一值。当用户访问p1作为客户端和服务器端数据库的会话变量时,存储此变量及其时间戳。加载p2时,检查它们提供的会话值在数据库中是否至少为5秒。如果是,让他们看看页面。然后删除数据库中的值。