【问题标题】:CodeIgniter Captcha value munged by session userdata?CodeIgniter Captcha 值被会话用户数据修改?
【发布时间】:2015-10-01 06:52:09
【问题描述】:

我正在尝试将 CodeIgniter 验证码助手质询词存储在 Session 变量中,如下所示:

$cap = create_captcha($val /* array of params */);  // Works fine
$this->session->set_userdata('cap-word', $cap['word']);

如果我在会话集之前和之后回显 $cap['word'],它是正确的(即浏览器中显示的内容)。如果我在设置会话变量后立即检索它,它也是正确的。

然而存储在会话中的内容完全不同 - 它的长度(字符数)正确,但字符串完全不同。因此,当我尝试在服务器端检索用户数据(验证码验证)时,它会得到错误的值。

(我已配置为 'sess_use_database' 并在每次页面加载后检查 phpMyAdmin 中的用户数据值。Cookie 加密已禁用。)

调试尝试:

  • 我已经尝试在将已知字符串存储到会话中之前将已知字符串添加/附加到验证码质询词。已知字符串可以很好地添加到会话用户数据中,但会附加到不正确的验证字词前。
  • 我尝试用固定字符串完全替换挑战词。这使得会话的往返没有问题。
  • 我尝试将验证码挑战词保存到不同的字符串变量(而不是直接从 $cap['word]' 传递),结果相同;只有挑战部分在登陆会话时会被“淘汰”。

调试后,我的代码看起来更像:

$cap = create_captcha($vals);
echo("<br>cap = ");
print_r($cap);
echo("<br>cap['word'] = " . $cap['word']);
$theword = $cap['word'];
echo("<br> Before theword = " . $theword);
$this->session->set_userdata('cap-word', $theword . 'abcdefg');
echo("<br> After theword = " . $theword);
echo("<br> Session output = " . $this->session->userdata('cap-word'));

这会在浏览器中产生以下输出:

cap = Array ([word] => 5CZaDeHm [time] => 1436765602.678 [image] => {图片})

cap['word'] = 5CZaDeHm

在这个词之前 = 5CZaDeHm

在单词之后 = 5CZaDeHm

会话输出 = 5CZaDeHmabcdefg

但是,会话表 userdata 字段中存储的内容(因此,当我在提交请求时调用 $this->session->userdata('cap-word') 时弹出的内容)是:

a:2:{s:9:"user_data";s:0:"";s:8:"cap-word";s:15:"3g5hb1I3abcdefg";}

因此,在调用 $this->session->set_userdata 期间,$theword 中的子字符串“5CZaDeHm”似乎已被“3g5hb1I3”替换。我不知道为什么,甚至不知道这怎么可能?!


更新 2015-07-13 07:50 EDT: 像往常一样,奥卡姆剃刀适用。结果在每次页面加载时,我的控制器被调用了两次,生成了 2 个带有 2 个相应挑战词的验证码图像。其中一个出现在浏览器中,另一个出现在会话的数据库行中。现在要弄清楚为什么......

【问题讨论】:

    标签: codeigniter session captcha


    【解决方案1】:

    原来 CodeIgniter 控制器被调用了两次,因为我在 CSS 标记的 href 参数中使用了相对路径。这导致浏览器尝试加载相对于页面的样式表,从而触发了页面的第二次加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多