RT. 
就像一些网站用来给忘记密码的用户,提供的密码重置的链接。发到用户注册邮箱里的那种,只能触发一次,用过一次以后就不能用了。有时候还有时间限制,比如24小时内链接有效之类的。谁知道 这个用 PHP 如何实现呢。  谢谢啦

解决方案 »

  1.   

    时间轴控制。先生成连接,记录生成时间,然后设置死亡时间。超过24小时或者点击过一次后就over
      

  2.   


    你是指弄个像MD5签名的token串,然后再验签吗? 那这样能保证 生成的随机链接的 “一次性” 呢? 
      

  3.   


    你可以记录这个地址是否被访问过.当然你也可以根据生成链接的ip做绑定,不过要考虑登录ID可能自身也会更换ip的问题.
      

  4.   

    “一次性”???
    很简单,你只需查询一下表,在表中就通过,否则就拒绝表中只需一个字段 char(32) 设为主键
    只存放需要验证内容的 MD5 值
    操作也很简单,执行 delete from tbl_name where key='值'
    如果 mysql_affected_rows 返回 0 就表示未通过这个方案可以验证任何“一次性”,只要你取得要验证对象的MD5。无需顾忌验证对象的真实内容
      

  5.   

    扯淡.点重置密码,你就给数据库插一行,有自增ID做KEY,并且有用户名,是否完成验证,创建日期TIME_STAMP,唯一标示符md5. (为了数据库安全性,生成一个MD5值作标识发给用户,md5(id . username . time))。
    然后发个URL在邮件里:xxxx.com?id=md5即可。用户访问这个url的时候从数据库里找该md5,标记完成即可。
      

  6.   


    感觉md5可以攻击,最好URL带上username,这样不易模仿了。
      

  7.   

    =。= 还用表? 这种数据记录下来貌似是给dba找麻烦呀...随便用 username + unixtimestamp + 一段key 然后对某几位进行一下哈希不就行了?....验证超时的时候,提取出unixtimestamp字段,就可以随意做时间限制了...
      

  8.   


    哇,  那怎么用、key来验证那链接是否是重复被访问呢?
      

  9.   


    蒽 现在想参照userID然后表里再放个rec的,<?php
      $filedir = 'path/to/file/';
      $filename = 'XXX.XXX';
    // 先判断下downRec的字段是否是1;
      if ($downRec = 1) {
        exit("already downloaded");
      } else if (!file_exits($filedir.$filename)) { 
          echo "something wrong with the file, contack the manager please.";
      } else {
        // $downRec++; 把字段更新成1    
        header("Content-Type: application/...");
        header("Content-Disposition: attachment; filename=" . $filename);
        ob_clean();
        flush();
        readfile($filedir.$filename);
        exit;
      }
    ?>    你觉得这样可以吗
    多谢拉 ^_^
      
      

  10.   


    哦哦 问个问题啊, 
    一直不懂,md5()只是把一串明文散列了下,就是验证了下双方一致, 怎么去保证 唯一性呢? 
    就是 对象的唯一性,和触发次数的唯一性。 比如说, 要触发下载了, http://xxx.com/callbackurl?user=xxxx&sign=xxxx    这里我的目标是:只是想要那个特定的满足之前的逻辑判断进入这个callbackurl.php的用户触发一次下载, 就是说 对于这个下载的事件、想要保证user对象的唯一性和下载次数的唯一型。 
      那这里是怎么保证这个链接 被复制 然后到别的客户端 黏贴之后 再去触发相同的下载事件呢?^_^ 多谢拉
                     
      

  11.   


    唉 乱了,
    先说那个吧, 为什么 加上username的参数 以后  就不容易 模仿了呢?  
     不是在要是 url 是 http://xxx.com/someurl?username=xxx&id=xxx
    那不是复制下就有username了吗
      

  12.   

    我说说我的思路。其实很简单
    因为SESSION是有生命期的,SESSION过期同时链接自动过期即可。
    思路:
    确定用户身份后。利用session ID+用户名 生成一个唯一的标识$_SESSION['FORGET_CODE']=md5(session_id() . 'XXX');        //XXX是要重置密码的用户名
    /*生成的链接如下*/
    $href="http://www.domain.com/forget.php?code={$_SESSION['FORGET_CODE']}";认证过程:forget.phpif(!empty($_GET('code'))){
        if($_SESSION['FORGET_CODE']==$_GET('code'))
              //成功,允许重置
        else
              //失败
    }说明:链接在会话失效后也失效了,一般用户找回密码后立刻登录邮箱点击链接.会话ID是唯一的,同时code也和帐号绑定起来。
      

  13.   

    1,可以把用户的申请时间记录到数据库中
    2,使用能解密的算法,把时间也做为数据加密,discuz有这种方法。