CodeIgniter Captcha值是否由会话userdata管理?

时间:2015-07-13 05:41:12

标签: codeigniter session captcha

我试图在Session变量中存储CodeIgniter验证码助手挑战词,如下所示:

$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]')传递,但结果相同;只有挑战部分才能获得" munged"登陆会议。

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

$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] =&gt; 5CZaDeHm [time] =&gt; 1436765602.678 [image] =&gt;   {图像})

     

cap [&#39; word&#39;] = 5CZaDeHm

     

在theword = 5CZaDeHm之前

     

theword = 5CZaDeHm

之后      

会话输出= 5CZaDeHmabcdefg

但是,会话表中存储的内容是userdata字段(因此,当我调用$ this-&gt; session-&gt; userdata(&#39; cap-word&#39;)时会弹出什么内容)提交请求)是:

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

因此,子串&#39; 5CZaDeHm&#39;在$ theword中,似乎已被&#39; 3g5hb1I3&#39;取代。在致电$ this-&gt; session-&gt; set_userdata期间。我不知道为什么,甚至这怎么可能?!

更新2015-07-13 07:50 EDT:像往常一样,Occam的Razor适用。结果显示每个页面加载,我的控制器被调用两次,生成2个验证码图像和2个相应的挑战词。其中一个出现在浏览器中,另一个出现在会话的数据库行中。现在弄明白为什么......

1 个答案:

答案 0 :(得分:0)

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

相关问题