我有一个基于会话的验证码的帖子表格,例如在刷新代码后知道的代码是Ujkd9成为Hi8P4。 这就是问题所在。如果有人发布表单,输入的验证码变旧,如何获得旧会话?
答案 0 :(得分:0)
嗯,你不能,但你可以将旧会话保存到另一个会话密钥中,创建该会话的副本,例如:
$ _ SESSION ['session_copy'] = $ _SESSION ['current'];
答案 1 :(得分: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,所以我不是百分之百的“最佳实践”,我也不知道你在做什么,所以这些对于一个模糊的问题,可能会有模糊的答案。我看到的方式大致有3种选择。
实际上,我可能会使用数据库作为第一个目标。在我的数据库中,我将有一个名为captcha的表,其定义如下:
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
,我不知道验证码会有多少封信。更改定义以适合您的使用。
你要做的是用语言:
$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.
现在请记住,我可能会在验证码数据中添加一个日期或时间列,以便我可以删除几个月内未使用过的帐户中的值,只是为了减小尺寸,但这是我留下的给你。
我不能说我推荐这个选项。它与我之前的答案实际上是一样的,只是没有数据库交互。
用语言来说,我们正在做以下事情:
$_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);
我想说,如果这是您选择的选项,那么您需要做出一些人生决定。不应该使用它。永远。认真。
话虽如此,这里的基本前提是
在代码中看起来如何:
$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);
重申一下:不要使用这种方法。我提供这个答案只是因为你的问题如何保持验证码的变化。