会话闪存数据正在更改 "magically",为什么?

Session Flash Data is changing "magically", why?

我有一个基于 CI 2.1.3 和 PHP 5.3.3 构建的项目。根据文档 here » 当我设置闪存数据会话变量时,闪存数据部分应该只对下一个请求可用,对吗?

我做了以下测试:

class auth1 extends CI_Controller
{
    public function index()
    {
        $this->load->helper('string');
        $key   = random_string('alnum', 8);
        $value = random_string('alnum', 20);
        $this->session->set_flashdata('csrfkey', $key);
        $this->session->set_flashdata('csrfvalue', $value);

        echo '<pre>';

        var_dump($this->session->flashdata('csrfkey'));
        var_dump($this->session->flashdata('csrfvalue'));
    }

    public function index2()
    {
        echo '<pre>';
        var_dump($this->session->flashdata('csrfkey'));
        var_dump($this->session->flashdata('csrfvalue'));
    }
}

我希望调用 /auth/index2 时具有相同的值,对吗?令人惊讶的是,这些正在发生变化,见下文:

// /auth/index
string(8) "meo6dhEr"
string(20) "JNNN07XMXfmADzYw6cKc"

// /auth/index2
string(8) "I2vmFRuO"
string(20) "CbDhiD8CkY3plOK7Hg7B"

有什么想法吗?我没有将它们设置在 index2 中,只是试图获取它们,但是它们在变化,为什么?

I would expect to have the same values when I call /auth/index2, right?

没有。你实际上已经解释了原因:

when I set a flashdata session var it should be available only for the next request, right?

您在index()中所做的那些var_dump()不会显示您刚刚设置的$key$value内容。它们显示您在 previous index() 调用中设置的值,但随后未调用 index2().

令人困惑,我知道。 CI2 就是这样......充满了错误和奇怪的东西,这就是为什么 它在几年前就停产了。尽快升级到最新的CI3.x

另外,CodeIgniter 有它自己的 CSRF 保护机制——您不需要实现它。而且 random_string() 并不是真正随机的...不要将其用于安全性。