【发布时间】: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