在重定向系统中混淆此Cookie

时间:2015-11-12 10:36:07

标签: php cookies

我在PHP工作。我想在登录后重定向页面到我想访问的最后一页,但是我仍然会在5小时内在这里堆叠,但我还没有完成。这是架构,我有3个php文件。

newest.php (before login), 
signin.php (before login), 
thread.php (after login). 

我正在使用Cookie进行此重定向。首先我去了newest.php,然后我点击了按钮(转到thread.php)。然后thread.php看到你还没有登录,然后重定向到signin.php。在我填写了登录表单之后,我点击了提交按钮(signin.php),然后我在signin.php堆栈(不会去任何地方)甚至在我登录之后,它应该转到thread.php自动。

这是我在newest.php& thread.php(不在signin.php中):

$coopage='coopage';
$current_page='http://'.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];
setcookie($coopage, $current_page,time()+86400,'/');

在newest.php中提交按钮(转到thread.php):

echo "<center><button onclick=\"window.location='/thread/form'\">add new thread</button></center>"; 

在signin.php中(点击提交按钮或提交区域后,因为表格和提交后我在同一页面中制作)(在页面底部):

if(isset($_COOKIE[$coopage])){
    $url=$_COOKIE[$coopage];
    unset($_COOKIE[$coopage]);
    header('location:'.$url);
}

注意:在signin.php中我还在此cookie之前设置了另一个cookie,这是原因吗?或者,如果我在一个页面中设置2个cookie,这是否重要?另一个cookie设置是这样的(在页面顶部)

$cooval2='juna';
setcookie($coousername, $cooval2, time() + (3600 * 24 * 365), "/"); // 1 year

2 个答案:

答案 0 :(得分:4)

我根本不会使用cookies。

方法1

一种可能的方法是将访问的链接存储到会话变量中,然后当用户到达login.php页面时,提供一个头部重定向到会话变量给出的$ url。

将此代码粘贴到您网站或主要容器上的所有页面中。

<?php
session_start(); 
$_SESSION['url'] = $_SERVER['REQUEST_URI']; 

对于登录页面,您可以:

<?php
session_start();  // needed for sessions.
if(isset($_SESSION['url'])) 
   $url = $_SESSION['url']; // holds url for last page visited.
else 
   $url = "student_account.php"; 

header("Location: http://example.com/$url"); 

方法2

到目前为止,一个更简单的解决方案就是:

<hidden name="redirurl" value="<? echo $_SERVER['HTTP_REFERER']; ?>" />

然后在登录后重定向到该地址。

但是,只有在每个页面都有一个登录框时才会这样做。

$_SERVER['REQUEST_URI']将只保留当前页面。你想要做的是使用$_SERVER['HTTP_REFERER']。 因此,将HTTP_REFERER保存在表单上的隐藏元素中,但是请注意处理表单的PHP中需要一些逻辑,如果登录失败,则需要重定向回登录页面,但也要检查引用者是否真的是你的网站,如果不是,则重定向回主页。

方法3

另一种常见的方法是通过$ _GET变量将用户的当前页面传递给Login表单。

更改您的脚本,以便告诉登录页面记住您的位置:

注意: $ _ SERVER ['REQUEST_URI'] 是您当前的页面

header("Location:login.php?location=" . urlencode($_SERVER['REQUEST_URI']));

现在检查它是否已填充,然后将用户发送到: 的login.php

echo '<input type="hidden" name="location" value="';
if(isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';
//  Will show something like this:
//  <input type="hidden" name="location" value="previousPage.php" />

登录-check.php

session_start();

//  our url is now stored as $_POST['location'] (posted from login.php). If it's blank, let's ignore it. Otherwise, let's do something with it.
$redirect = NULL;
if($_POST['location'] != '') {
    $redirect = $_POST['location'];
}

if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
    $url = 'login.php?p=1';
    // if we have a redirect URL, pass it back to login.php so we don't forget it
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location: " . $url);
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
    $url = 'login.php?p=2';
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location:" . $url);
   exit();
}
elseif(isset($_SESSION['id_login'])) {
    // if login is successful and there is a redirect address, send the user directly there
    if($redirect)) {
        header("Location:". $redirect);
    } else {
        header("Location:login.php?p=3");
    }
    exit();
}

答案 1 :(得分:1)

您的新Cookie =&gt;本地存储,请确保在每个页面上都有此代码,除了登录页面之外,您还要记录该URL,否则它会将您重定向回登录页面。

var currentPage = window.location.href;
localStorage.lastPageVisited = currentPage

这是提交按钮的代码,它会将用户重定向到他访问的最后一页。

$(document).ready(function() {
    $('button').click(function() {
        window.location.href = localStorage.lastPageVisited;
    });
});