如何获得旧会话?

时间:2014-09-06 16:58:54

标签: php session captcha

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

2 个答案:

答案 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种选择。

1。数据库存储

实际上,我可能会使用数据库作为第一个目标。在我的数据库中,我将有一个名为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,我不知道验证码会有多少封信。更改定义以适合您的使用。

你要做的是用语言:

  1. 使用当前session_id查询数据库以查看验证码图像是否存在。
  2. 在变量中设置信息,我正在使用$captcha_data
  3. 如果$ captcha_data填充了信息,请使用其验证码字符串,否则,创建一个新的并存储它。
  4. 请注意,对于此示例,我假设您的数据库连接(无论它是什么类型)位于名为$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']值,如果是,请使用它。如果没有,请创建它。
    2. 这段代码看起来很奇怪,所以我建议查找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. 否则,创建一个新哈希,创建并填充文件中的数据。
      4. 在代码中看起来如何:

        $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);
        

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