php发送邮箱重置密码链接,并在重置成功后使链接失效 (ThinkPHP5)
/**
* 重置密码页,验证链接有效性,页面发送邮件调用sendResetPwdEmail()方法
*/
public function resetPwd()
{
$param = input('');
$bool = $this->verifyUrl($param);
if ($bool) {
$this->assign("param", $param);
return $this->fetch('resetpwd');
} else {
abort(404, '链接失效或错误');
}
}
/**
* 执行重置密码
*/
public function doResetPwd()
{
$param = input('param.'); // 验证链接有效性
$bool = $this->verifyUrl($param);
if ($bool) {
$validateRes = is_pwd($param['password']);
if (!$validateRes) {
return info(lang("密码必须包含大小写字母,数字,长度为8~16"), 0);
}
if ($param['password'] != $param['rpassword']) {
return info('两次密码输入不一致', 1);
} else {
$c = explode('+', base64_decode($param['c']));
try {
model('User')->where(['email' => $c[0]])->update(['password' => mduser($param['password'])]);
return info('密码重置成功');
} catch (Exception $e) {
return info('密码重置失败,请联系管理员');
}
}
} else {
abort(404, '链接失效或错误');
}
}
/**
* 重置密码发送邮箱
*/
public function sendResetPwdEmail()
{
$param = input('post.email');
if (empty($param)) {
return false;
}
$data = model('user')->getRow(['email' => $param], 'id,it_code,password');
if (empty($data)) {
return info('邮箱未注册', 0);
}
$time = time();
$key1 = base64_encode($param . '+' . $time);
$key2 = md5($data['id'] . $data['it_code'] . $data['password'] . $time . config('user_auth_key'));
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . url('/resetPwd', ['c' => $key1, 'k' => $key2]);
$body = "<b>" . $data['it_code'] . ',您好:</b></br></br></n>'
. ' 感谢您使用门户平台!</br></br>'
. ' 请<a href="' . $url . '">点击这里重置密码</a>。';
$receiver = array($param); // 发送邮件方法另见下一篇文章
$res = send_mail($receiver, '门户平台密码重置', $body);
if ($res) {
return info('邮件发送成功,请查收邮件', 1);
} else {
return info('邮件发送失败,请联系管理员', 0);
}
}
/**
* 验证链接有效性
*/
private function verifyUrl($param)
{
if (empty($param['c']) || empty($param['k'])) {
return false;
}
$c = explode('+', base64_decode($param['c']));
if (count($c) != 2) {
return false;
} // 用户数据不存在 页面失效
$userData = model('user')->getRow(['email' => $c[0]], 'id,it_code,password');
if (empty($userData)) {
return false;
} // 密码重置后 页面失效
$key = md5($userData['id'] . $userData['it_code'] . $userData['password'] . $c[1] . config('user_auth_key'));
if ($key != $param['k']) {
return false;
} // 时间过1800s 页面失效
if ($c[1] + 1800 < time()) {
return false;
}
return true;
}
php发送邮箱重置密码链接,并在重置成功后使链接失效 (ThinkPHP5)的更多相关文章
- AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...
- Microsoft.AspNet.Identity 重置密码
重置密码:先生成重置密码的Token,然后调用ResetPassword方法重置密码,密码要符合规则.. ApplicationUserManager UserManager => _userM ...
- Java实现发送邮箱验证码/注册验证链接
本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...
- wordpress新注册用户或重置密码链接失效
在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...
- Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- python发送邮箱
一.Python发送邮件 import smtplib from email.mime.text import MIMEText def send(email_to,title,content): m ...
- [py][mx]django通过邮箱找回密码
忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
随机推荐
- luogu P5289 [十二省联考2019]皮配
传送门 首先考虑一个正常的dp,设\(f_{i,j,k}\)为前\(i\)个学校,\(j\)人在\(\color{#0000FF}{蓝阵营}\),\(k\)人在\(\color{#654321}{吔} ...
- [笔记]猿计划(WEB安全工程师养成之路系列教程):02HTML头部标签
1.什么是HTML? HTML是用来描述网页的一种语言 HTML——超文本标记语言(Hyper Text Markup Language) HTML不是编程语言,是一种标记语言 标记语言是一套标记标签 ...
- 一个基于angularJS的工资计算器
先看界面: 其实在ng中最让人印象深刻的就是数据的双向绑定,在html中就完成了很多操作.大概用到的就是控制器视图服务等,没有分模块写控制器,代码如下: <html ng-app = " ...
- oracle 11.2.0.4 rac 修改 ip vip scan ip
修改前host文件 198.27.73.21 ht-d01 198.27.73.22 ht-d02 198.27.73.25 ht-d01-vip 198.27.73.26 ht-d02-vip 19 ...
- 如何在Window下安装node\npm\cnpm,并安装vue.js,创建项目
1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...
- 1.arm的linux系统搭建
从裸板到系统 一般是CPU内部有启动代码,如nuvoton的nuc900系列的芯片内部就有ibr程序,来控制启动过程,在usb启动时负责加载usb驱动,这样在pc端就可以识别到usb设备了,然后通过t ...
- Android的路接下来该怎么走?
其实想写这篇文章好久了,很多小伙伴们也经常在群里探讨android移动开发者的走向,一部分人都想多快好省,间歇性踌躇满志.持续性混吃等死 ,只想用CV的开发模式们快速完成工作,然后回家王者农药.其实这 ...
- NOIP2016换教室
题目 一道毒瘤概率期望DP.点这里 首先 对于每个时间段(就是每节课),我们有申请和不申请两种情况.如果不申请的话,一定在$ c[ i ] \(,否则,可能在\)c[ i ]\(,也可能在\)d[ i ...
- fs.inotify.max_user_watches默认值太小,导致too many open files
运行环境:centos7.5 linux 打开文件数 too many open files 解决方法fs.inotify.max_user_watches默认值太小,导致too many open ...
- 关于读取excel 和 写excel
def sync_db(data_list): '''Synchron potential student from excel to PrepareToCrm ''' push_list = ...