如何生成“密码重置”那种“一次性链接” RT. 就像一些网站用来给忘记密码的用户,提供的密码重置的链接。发到用户注册邮箱里的那种,只能触发一次,用过一次以后就不能用了。有时候还有时间限制,比如24小时内链接有效之类的。谁知道 这个用 PHP 如何实现呢。 谢谢啦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 时间轴控制。先生成连接,记录生成时间,然后设置死亡时间。超过24小时或者点击过一次后就over 你是指弄个像MD5签名的token串,然后再验签吗? 那这样能保证 生成的随机链接的 “一次性” 呢? 你可以记录这个地址是否被访问过.当然你也可以根据生成链接的ip做绑定,不过要考虑登录ID可能自身也会更换ip的问题. “一次性”???很简单,你只需查询一下表,在表中就通过,否则就拒绝表中只需一个字段 char(32) 设为主键只存放需要验证内容的 MD5 值操作也很简单,执行 delete from tbl_name where key='值'如果 mysql_affected_rows 返回 0 就表示未通过这个方案可以验证任何“一次性”,只要你取得要验证对象的MD5。无需顾忌验证对象的真实内容 扯淡.点重置密码,你就给数据库插一行,有自增ID做KEY,并且有用户名,是否完成验证,创建日期TIME_STAMP,唯一标示符md5. (为了数据库安全性,生成一个MD5值作标识发给用户,md5(id . username . time))。然后发个URL在邮件里:xxxx.com?id=md5即可。用户访问这个url的时候从数据库里找该md5,标记完成即可。 感觉md5可以攻击,最好URL带上username,这样不易模仿了。 =。= 还用表? 这种数据记录下来貌似是给dba找麻烦呀...随便用 username + unixtimestamp + 一段key 然后对某几位进行一下哈希不就行了?....验证超时的时候,提取出unixtimestamp字段,就可以随意做时间限制了... 哇, 那怎么用、key来验证那链接是否是重复被访问呢? 蒽 现在想参照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; }?> 你觉得这样可以吗多谢拉 ^_^ 哦哦 问个问题啊, 一直不懂,md5()只是把一串明文散列了下,就是验证了下双方一致, 怎么去保证 唯一性呢? 就是 对象的唯一性,和触发次数的唯一性。 比如说, 要触发下载了, http://xxx.com/callbackurl?user=xxxx&sign=xxxx 这里我的目标是:只是想要那个特定的满足之前的逻辑判断进入这个callbackurl.php的用户触发一次下载, 就是说 对于这个下载的事件、想要保证user对象的唯一性和下载次数的唯一型。 那这里是怎么保证这个链接 被复制 然后到别的客户端 黏贴之后 再去触发相同的下载事件呢?^_^ 多谢拉 唉 乱了,先说那个吧, 为什么 加上username的参数 以后 就不容易 模仿了呢? 不是在要是 url 是 http://xxx.com/someurl?username=xxx&id=xxx那不是复制下就有username了吗 我说说我的思路。其实很简单因为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也和帐号绑定起来。 1,可以把用户的申请时间记录到数据库中2,使用能解密的算法,把时间也做为数据加密,discuz有这种方法。 php模拟post出错 PHP+MYSQL乱码,求助 服务器问题,求大牛帮帮忙 请各位达人帮看一下这个问题出哪儿? 正则表达式如何将带有标识的元素里的内容批量替换? 是否我的PHP环境出问题了~~ 请问怎么才能浏览PHP的页面? 已经第五天了,在WIN2000下屡装PHP+MYSQL+APACHE都不成功,极其郁闷啊,也查了很多资料,真想炸了机子,对PHP的学习打击太大了,那个大哥 关于cookie的问题,希望高手指点迷津,谢谢了。 日期问题!怎样得到三天内的所有内容。 求伪静态的 PHP 程序解决方法!! 字符转义问题
你是指弄个像MD5签名的token串,然后再验签吗? 那这样能保证 生成的随机链接的 “一次性” 呢?
你可以记录这个地址是否被访问过.当然你也可以根据生成链接的ip做绑定,不过要考虑登录ID可能自身也会更换ip的问题.
很简单,你只需查询一下表,在表中就通过,否则就拒绝表中只需一个字段 char(32) 设为主键
只存放需要验证内容的 MD5 值
操作也很简单,执行 delete from tbl_name where key='值'
如果 mysql_affected_rows 返回 0 就表示未通过这个方案可以验证任何“一次性”,只要你取得要验证对象的MD5。无需顾忌验证对象的真实内容
然后发个URL在邮件里:xxxx.com?id=md5即可。用户访问这个url的时候从数据库里找该md5,标记完成即可。
感觉md5可以攻击,最好URL带上username,这样不易模仿了。
哇, 那怎么用、key来验证那链接是否是重复被访问呢?
蒽 现在想参照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;
}
?> 你觉得这样可以吗
多谢拉 ^_^
哦哦 问个问题啊,
一直不懂,md5()只是把一串明文散列了下,就是验证了下双方一致, 怎么去保证 唯一性呢?
就是 对象的唯一性,和触发次数的唯一性。 比如说, 要触发下载了, http://xxx.com/callbackurl?user=xxxx&sign=xxxx 这里我的目标是:只是想要那个特定的满足之前的逻辑判断进入这个callbackurl.php的用户触发一次下载, 就是说 对于这个下载的事件、想要保证user对象的唯一性和下载次数的唯一型。
那这里是怎么保证这个链接 被复制 然后到别的客户端 黏贴之后 再去触发相同的下载事件呢?^_^ 多谢拉
唉 乱了,
先说那个吧, 为什么 加上username的参数 以后 就不容易 模仿了呢?
不是在要是 url 是 http://xxx.com/someurl?username=xxx&id=xxx
那不是复制下就有username了吗
因为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也和帐号绑定起来。
2,使用能解密的算法,把时间也做为数据加密,discuz有这种方法。