我有一个基于会话的验证码的帖子表格,例如在刷新代码后知道的代码是Ujkd9变成Hi8P4。 这就是问题所在。如果有人发布表单,输入的验证码会变老,如何获取旧会话?如何获得旧会话?
如何获得旧会话?
回答
那么你不能,但你可以保存较早的会话到另一个会话密钥创建会话的副本,通过例如:
$ _SESSION [“session_copy”] = $ _SESSION [“目前”] ;
我假设您的验证码正在飞行中,并通过一些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
我不知道你的验证码会有多少个字母。更改定义以适合您的使用。
你所要做的事情,在话来说就是:
- 查询当前session_id的数据库,看是否captcha图像存在。
- 将信息设置为变量,我正在使用
$captcha_data
- 如果$ 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存储
我不能说我推荐这个选项。这与我之前的回答完全一样,只是没有数据库交互。
在口头上,我们正在做以下几点:
- 检查,如果
$_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.文件系统存储
我想说,如果这是你的选择选择你有一些人生的决定。这不应该使用。永远。认真。
话虽这么说,基本的前提这里是
- 看看是否与当前的session_id文件是否存在。
- 如果是这样,请阅读它的内容,并将它们用作图像的哈希值。
- 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);
只是重申:请不要使用此方法。我提供这个答案只是因为你的问题问如何保持验证码不变。
- 1. UIProgressView:如何获得旧式?
- 2. 如何获得表单中的会话?
- 3. 如何获得会话的价值
- 4. 获取旧的REST会话密钥
- 5. 如何在iTerm2中终止旧会话
- 6. 如何判断陈旧的会话与没有Java的会话
- 7. 通过ID获得会话
- 8. 如何获得textarea的旧值
- 9. 如何获得较旧版本的riak
- 10. 如何在Python3中获得“旧”zip()?
- 11. 如何在esper中获得旧事件?
- 12. 如何获得.NET Standard的旧版本?
- 13. 比较新旧会话
- 14. 如何获得结束视频会话的会话统计信息
- 15. 为什么不HttpRequest.getSession(真)获得新的会话时,旧的空/无效
- 16. 如何在下一个会话中使用从旧会话保存的数据?
- 17. 会话在ashx中设置并在aspx上获得该会话
- 18. 如何获得以相同单词开头的所有会话?
- 19. 如何在PHP中的类中获得会话变量
- 20. 如何在jQuery的会话中获得价值
- 21. 如何获得(Express)会话ID以用于WebSocket连接
- 22. 在R如何获得会话时差统计
- 23. 如何获得终端会话开始的通知
- 24. 如何获得会话使用PHP客户端库
- 25. 如何在模型中获得Symfony会话变量?
- 26. 我如何获得一个ListView项目的会话信息
- 27. 如何在会话期间获得新的套接字连接?
- 28. 我们如何从access_token获得会话密钥
- 29. 如何获得ASP.NET MVC会话过期前的URL
- 30. 我如何获得java中的会话ID