是一个过时的会话,用于停止正在提交的发布变量


Is a stale session stopping post variables being submitted

我间歇性地遇到这个问题已经有一段时间了,但我只是让它反复发生,以至于无法解决它。它在FF中反复发生,但我在Chrome中也看到过。

我有如下登录表格,它很简单,电子邮件地址和密码以及提交按钮

    <form method="post" action="login.php" id="valid" class="mainForm">
        <fieldset>
            <div class="">
                <label for="req1">Email:</label>
                <div class="loginInput"><input style="width: 100%;" type="text" name="email" class="validate" id="req1" /></div>
                <div class="fix"></div>
            </div>
            <div class="">
                <label for="req2">Password:</label>
                <div class="loginInput"><input style="width: 100%;" type="password" name="password" class="validate" id="req2" /></div>
                <div class="fix"></div>
            </div>
            <input name="action" type="hidden" value="log_in" />
            <div class="">
                <div class=""><input type="checkbox" id="check2" name="remember_me" value="1"/><label>Remember me</label></div>
                <input type="submit" value="Log me in" class="submitForm" />
                <div class="fix"></div>
            </div>
        </fieldset>
    </form>

提交上面的表格不会让我登录,它只是再次显示登录表格,就好像什么都没有提交一样。所以我修改了提交到的login.php文件,并在最上面添加了print_r($_POST);

当我再次提交表单时,它显示的只是一个空数组。就好像表单变量没有被发送一样。我尝试了几个帐户,每次都得到一个空白数组。

然后,我试图输入一个数据库中没有的新电子邮件地址,令我惊讶的是,$_POST数组中填充了假电子邮件和密码。然后我再次尝试了一个真实的账户,但它是空白的。

我做的最后一件事是删除FF中该网站的会话cookie,然后重试。令我惊讶的是,我可以正常登录。之后我登录和注销了几次,没有任何问题!

因此,我的问题是:会话cookie是如何防止post变量被发送的(如果这是实际发生的事情)?如果我输入了一个假电子邮件地址,为什么它会填充$_post数组?我所做的print_r($_POST)是脚本中的第一件事,在任何其他处理或包含之前,但它仍然是空的??

我想我真的不知道浏览器是如何处理会话cookie的,但这种行为让我完全一无所知。

关于如何解决此问题的任何建议,或常规会话建议。

EDIT-登录的PHP代码.PHP

<?php
print_r($_POST);
include '../inc/init.php';
$action = fRequest::get('action');
if ('log_out' == $action) {
    fSession::destroy();
    fAuthorization::destroyUserInfo();
    fMessaging::create('success', '<center>You were successfully logged out</center>');
}
if (fAuthorization::checkAuthLevel('user') || fAuthorization::checkAuthLevel('buser')) {
    fURL::redirect('index.php');
}

if ('log_in' == $action) {
    # Set session variables etc...
}

顶部的init.php include设置数据库连接字符串并启动会话等。我使用的是FlourishLib Un Framework类集,其中包括一个会话类。

感谢

请尝试此代码

$actions = array('log_in', 'log_out');
$action = fRequest::getValid('action', $actions);
if ($action == 'log_out') {
fSession::clear();
fAuthorization::destroyUserInfo();
fMessaging::create('success', URL_ROOT . 'index.php', 'You were successfully logged   out');
fURL::redirect(URL_ROOT . 'index.php');
}
if ($action == 'log_in') {
if (fRequest::isPost()) {
    try {
        $valid_login = fRequest::get('username') == 'yourlogin';
        $valid_pass = md5(fRequest::get('password')) == 'md5(youpassword)'; 
        if (!$valid_login || !$valid_pass) {
            throw new fValidationException('The login or password entered is invalid');
        }
        fAuthorization::setUserToken(fRequest::get('username'));
        fURL::redirect(fAuthorization::getRequestedURL(TRUE, URL_ROOT . 'index.php'));
    } catch (fExpectedException $e) {
        fMessaging::create('error', fURL::get(), $e->getMessage());
    }
}
include VIEWS_DIR . DS . basename(__FILE__);
}