2014-09-06 121 views
-3

我有一个基于会话的验证码的帖子表格,例如在刷新代码后知道的代码是Ujkd9变成Hi8P4。 这就是问题所在。如果有人发布表单,输入的验证码会变老,如何获取旧会话?如何获得旧会话?

回答

0

那么你不能,但你可以保存较早的会话到另一个会话密钥创建会话的副本,通过例如:

$ _SESSION [“session_copy”] = $ _SESSION [“目前”] ;

0

我假设您的验证码正在飞行中,并通过一些PHP中的图像输出。您的问题是,一旦您制作图像并输出图像,您无法弄清楚CAPTCHA的实际价值是什么?

因为我绝对没有什么应用程序结构的知识,或数据库的样子,我可以给你根据我会做什么,建议:

如果我可以假设你的PHP脚本看起来是这样的:

$captcha_string = make_hash(); // This function could just be the consolidation of your step in making the hash. I don't know, so it's going to be generic. 

make_captcha_image($captcha_string); // Again, I don't know exactly how this goes, so I have to assume. 

用外行人的话说,你需要把它存储在某个地方。但是哪里?现在,我要记住,我从来没有特别直接与Captcha合作过,所以我不是100%的“最佳实践”,我也不知道你在做什么,所以这些对于一个模糊的问题可能会是模糊的答案。大致有三种选择,我看到它的方式。

1.数据库存储

实际上,我可能会使用数据库作为第一个前往。在我的数据库我想有一个表名为验证码,如下定义: CREATE TABLE captcha (captcha_id int unique not null auto_increment, session_id VARCHAR(100) NOT NULL, captcha_string VARCHAR(6) NOT NULL) 注:我不知道session_id()函数将返回什么长,我目前无法检查。如果您知道会话ID有多长,请更改session_id的长度以匹配。同样的captcha_string我不知道你的验证码会有多少个字母。更改定义以适合您的使用。

你所要做的事情,在话来说就是:

  1. 查询当前session_id的数据库,看是否captcha图像存在。
  2. 将信息设置为变量,我正在使用$captcha_data
  3. 如果$ captcha_data中填充了信息,请使用其验证码字符串,否则请创建一个新的并将其存储。

注意,在这个例子中,我假设你的数据库连接,无论何种类型是,坐在我使用没有特殊类型的数据库,只是我在我自己的数据库类使用方法命名为$db的对象。这些定义对你来说看起来很相似,但可能并不确切。

$session_id = session_id(); 
$sql = "SELECT * FROM captcha WHERE session_id='".mysqli_real_escape_string($session_id)."'"; 
$result = $db->query($sql); 
if($result!==false){ 
    $captcha_data = $db->fetchrow($result); 
} 
$db->free_result($result); 



$captcha_string = (isset($captcha_data['captcha_string'])) ? $captcha_data['captcha_string'] : make_hash(); // This function could just be the consolidation of your step in making the hash. I don't know, so it's going to be generic. 

if(!isset($captcha_data['captcha_id'])){ 
    $sql = "INSERT INTO captcha (session_id, captcha_string) VALUES('".mysqli_real_escape_string($session_id)."','".mysqli_real_escape_string($captcha_string)."')"; 
    $db->query($sql);//You should check that this query is successful in your code, but for brevity I am skipping it. 
} 

make_captcha_image($captcha_string); // Again, I don't know exactly how this goes, so I have to assume. 

现在记住,我可能会添加一个日期或时间列验证码数据,这样我可以删除那些没有在某些月份中使用,只是为了保持尺寸减小账户值,但这是我留给你的东西。

2。$ _SESSION存储

我不能说我推荐这个选项。这与我之前的回答完全一样,只是没有数据库交互。

在口头上,我们正在做以下几点:

  1. 检查,如果$_SESSION['captcha_id']值设置,如果是这样,使用它。如果没有,创建它。

此代码会看起来很奇怪,所以我建议仰视Ternary Operators

//Assuming your session_start() is at the top of the page 

$captcha_id = $_SESSION['captcha_id'] = (isset($_SESSION['captcha_id'])) ? $_SESSION['captcha_id'] : make_hash(); 

make_captcha_image($captcha_string); 

3.文件系统存储

我想说,如果这是你的选择选择你有一些人生的决定。这不应该使用。永远。认真。

话虽这么说,基本的前提这里是

  1. 看看是否与当前的session_id文件是否存在。
  2. 如果是这样,请阅读它的内容,并将它们用作图像的哈希值。
  3. else,创建一个新的哈希,创建并填充文件中的数据。

如何,看起来在代码:

$session_id = session_id(); 
if(file_exists('temp/'.$session_id.'.php')){ 
    $captcha_string = $captcha_data = file_get_contents('temp/'.$session_id.'.php'); 
}else{ 
    $captcha_string = hash(); 
    file_put_contents('temp/'.$session_id.'.php',$captcha_string); 
} 

make_captcha_image($captcha_string); 

只是重申:请不要使用此方法。我提供这个答案只是因为你的问题问如何保持验证码不变。