Email接收验证码,以实现登录/注册/修改密码
要求
1)实现Email形式的注册功能和相应的登录功能;
2)实现忘记密码时的密码找回功能;
3)存在数据库中的密码不能以明文形式存放,即建议在浏览器端发送请求前,调用js代码对用户的密码做md5加密
分析
第3)点较简单,重点学习一波email接收验证码。
网上粗略了解了一下,PHP自带mail()函数可实现邮件的收发,但在php5.3版本后需开启本地email服务器才能使用。
所以搭建了hmailserver服务,具体参考:
mysql+hmailServer+roundcubemail整合开发(一)
文件拓扑

代码及演示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>web实验2</title>
<script type="text/javascript" src="function.js"></script>
<script type="text/javascript" src="md5.js"></script>
</head>
<body> <form name="fm1" action="index.php" method="post" onsubmit="return IsEmpty()">
<div style="text-align: center;">
<h1>登录页面 </h1><br><br><br>
<input type="text" name="user" placeholder="帐号" id="usr"/>
<select name="mail">
<option value="@163.com">@.com</option>
<option value="@126.com">@.com</option>
<option value="@hdu.edu.cn">@hdu.edu.cn</option>
</select>
</br><input type="password" name="password_plain" placeholder="密码" id="pwd"/>
<input type=hidden name="password_md5" id="pwd1" />
<a href="resetpwd.php">忘记密码?</a>
</br>
<input type="submit" name="submit" value="登录" onclick="enCodePWD()"/>
<button onclick="location.href='register.php'" type="button">注册</button>
</div>
</form>
</body>
</html>
login.php

当登录为空

亦或



<!DOCTYPE html>
<html>
<html>
<head>
<meta charset="UTF-8">
<title>web实验2</title>
<script type="text/javascript" src="function.js"></script>
<script type="text/javascript" src="md5.js"></script>
</head>
<body> <form name="fm1" action="" method="post" onsubmit="return IsEmpty()">
<div style="text-align: center;">
<h1>注册页面 </h1><br><br><br>*
<input type="text" name="user" placeholder="帐号" id="usr"/>
<select name="mail">
<option value="@163.com">@.com</option>
<option value="@126.com">@.com</option>
<option value="@hdu.edu.cn">@hdu.edu.cn</option>
</select>
</br>*
<input type="password" name="password_plain" placeholder="密码" id="pwd"/>
<input type=hidden name="password_md5" id="pwd1" />
</br> *
<input type="text" name="code" placeholder="验证码" id="cd"/>
<button type="submit" name="bttn" value="" onclick="IsEmpty()">点击获取验证码</button>
</br>
<input type="submit" name="submit" value="注册" onclick="enCodePWD()"/>
</div>
</form>
</body>
</html> <?php
$servername = "localhost";$usernm = "root";$passwd = "root";$dbname = "test";
@$c_user=@$_POST['user'].@$_POST['mail'];@$c_password=@$_POST['password_md5'];
if((@$_POST['submit'] || @$_POST['bttn']) && $_POST['user'] && $_POST['password_plain']){
// 创建连接
$conn = mysqli_connect($servername, $usernm, $passwd, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: ".mysqli_connect_error());
}
else{
@$sql = "SELECT * FROM client where user='".$c_user."'";
$result = mysqli_query($conn, $sql);
//检错
if (!$result) {
printf("Error: %s\n", mysqli_error($conn));
exit();
}
//查询用户是否存在
if (mysqli_num_rows($result)) {
echo '<script>alert("用户已存在!");history.go(-1);</script>';
}
else{
if(@$_POST['bttn'])
include_once("reqcode.php");
else
include_once("reg.php");
}
$conn->close();
}
}
?>
register.php

先判断账号/密码是否为空/合法

没输入验证码就注册

注册用户已存在

否则

登录邮箱接收验证码

验证码有效时间1分钟

成功注册,3s后自动跳转login.php

<!DOCTYPE html>
<html>
<html>
<head>
<meta charset="UTF-8">
<title>web实验2</title>
<script type="text/javascript" src="function.js"></script>
<script type="text/javascript" src="md5.js"></script>
</head>
<body> <form name="fm1" action="" method="post">
<div style="text-align: center;">
<h1>更改密码 </h1><br><br><br>*
<input type="text" name="user" placeholder="帐号" id="usr"/>
<select name="mail">
<option value="@163.com">@.com</option>
<option value="@126.com">@.com</option>
<option value="@hdu.edu.cn">@hdu.edu.cn</option>
</select>
</br>*
<input type="password" name="password_plain" placeholder="新密码" id="pwd"/>
<br>*
<input type="password" name="password_cfm" placeholder="确认密码" onblur="return confirm_pwd()" id="pwd2"/></input>
<input type=hidden name="password_md5" id="pwd1" />
</br> *
<input type="text" name="code" placeholder="验证码" id="cd"/>
<button type="submit" name="bttn" value="" onclick="IsEmpty()">点击获取验证码</button>
</br>
<input type="submit" name="submit" value="提交" onclick="enCodePWD()"/>
</div>
</form>
</body>
</html> <?php
$servername = "localhost";$usernm = "root";$passwd = "root";$dbname = "test";
@$c_user=@$_POST['user'].@$_POST['mail'];@$c_password=@$_POST['password_md5'];
if((@$_POST['submit'] || @$_POST['bttn']) && $_POST['user'] && $_POST['password_plain'] && $_POST['password_cfm']){
// 创建连接
$conn = mysqli_connect($servername, $usernm, $passwd, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: ".mysqli_connect_error());
}
else{
@$sql = "SELECT * FROM client where user='".$c_user."'";
$result = mysqli_query($conn, $sql);
//查询用户是否存在
if (mysqli_num_rows($result)) {
if(@$_POST['bttn'])
include_once("reqcode.php");
else
include_once("chng.php");
}
else{
echo '<script>alert("用户不存在!");history.go(-1);</script>';
}
$conn->close();
}
}
?>
resetpwd.php

确认密码不一致

成功修改

(其他演示同注册页面)
<?php
$servername = "localhost";$usernm = "root";$passwd = "root";$dbname = "test";
if(@$_POST['submit']){
$c_user=$_POST['user'].$_POST['mail'];$c_password=$_POST['password_md5'];
}
// 创建连接
$conn = mysqli_connect($servername, $usernm, $passwd, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: ".mysqli_connect_error());
}
else{
@$sql = "SELECT * FROM client where user='".$c_user."' and "."password='".$c_password."'";
$result = mysqli_query($conn, $sql);
//检错
if (!$result) {
printf("Error: %s\n", mysqli_error($conn));
exit();
}
//查询成功
if (mysqli_num_rows($result)) {
//输出数据
$row = mysqli_fetch_assoc($result);
$username=$row["user"];
echo "Welcome~:".$username."<br>"."Ur password~:".$row["password"];
}
else{
echo '<script>alert("用户名或密码错误!");history.go(-1);</script>'; }
$conn->close();
}
?>
index.php

<?php session_start(); $rd = rand(,);
$to = $c_user;
$subject = "验证码";
$message = $rd;
$from = "server@test4fun.cn";
$headers = "From: $from";
if(mail($to,$subject,$message,$headers)){
echo "<br><br><div style='text-align: center;'>:)<br>验证码已发送至邮箱:".$c_user."<br>注册密码:".$_POST['password_plain']."<br>请注意查收!!!</div>";
} setcookie('rd', $rd, time()+*);//验证码
setcookie('tm', time(), time()+*);//验证码失效时间的起始时间戳 ?>
reqcode.php
<?php
//检测验证码是否为空
if(!$_POST['code']){
echo '<script>alert("验证码为空!");history.go(-1);</script>';
exit();
}
//验证码失效时间为60秒
if (time() - @$_COOKIE['tm'] < ){
if ($_POST['code'] == $_COOKIE["rd"]) {
@$sqli = "INSERT INTO client (user,password) VALUES ('".$c_user."','".$c_password."')";
$result = mysqli_query($conn, $sqli);
if ($result) {
header('refresh:3; url=login.php');
echo "<br><br><div style='text-align: center;'>):<br>注册成功,请登录!</div>";;
}
}
else{
echo "<br><br><div style='text-align: center;'>:(<br>验证码错误!</div>";
}
}
else{
echo "<br><br><div style='text-align: center;'>:(<br>验证码已过期!</div>";
} ?>
reg.php
<?php
//检测验证码是否为空
if(!$_POST['code']){
echo '<script>alert("验证码为空!");history.go(-1);</script>';
exit();
}
//验证码失效时间为60秒
if (time() - @$_COOKIE['tm'] < ){
if ($_POST['code'] == $_COOKIE["rd"]) {
@$sqli = "UPDATE client SET password = '".$c_password."' WHERE user = '".$c_user."'";
$result = mysqli_query($conn, $sqli);
if ($result) {
header('refresh:3; url=login.php');
echo "<br><br><div style='text-align: center;'>):<br>密码修改成功,请登录!</div>";;
}
}
else{
echo "<br><br><div style='text-align: center;'>:(<br>验证码错误!</div>";
}
}
else{
echo "<br><br><div style='text-align: center;'>:(<br>验证码已过期!</div>";
} ?>
chng.php
//md5加密密码
function enCodePWD(){
document.getElementById('pwd1').value=md5(document.getElementById('pwd').value);
} function IsEmpty(){
var usr = document.getElementById("usr");
//判断用户名是否为空
if(usr.value==""){
alert(":( 用户名不能为空!");
return false;
}
//判断用户名是否合法
if(/^[a-zA-Z0-]{,}$/.test(usr.value) != true){
alert(":( 用户名不合法!");
return false;
}
var passwd = document.getElementById("pwd");
//判断密码是否为空
if(passwd.value==""){
alert(":( 密码不能为空!");
return false;
}
return true;
} function confirm_pwd(){
var passwd = document.getElementById("pwd");
var passwd_cfm = document.getElementById("pwd2");
if(passwd.value != passwd_cfm.value){
alert("密码不一致");
passwd_cfm.value = "";
return false;
}
return true;
} /*
var wait=11;
function renew_btn(){
var btn=document.getElementById("btn");
if(wait == 0){
btn.removeAttribute("disabled");
btn.innerHTML="重新获取验证码";
wait=60;
}
else{
if(wait == 11){
alert("验证码已发送至你的邮箱,请尽快查收~!");
}
btn.setAttribute("disabled", true);
if(wait<10){
btn.innerHTML=" 重新发送(0"+wait+") ";
}
else{
btn.innerHTML=" 重新发送("+wait+") ";
}
wait--;
setTimeout(function(){renew_btn()},1000)
}
}
*/
function.js
!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<<t|n>>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<<r%32,n[14+(r+64>>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e<n.length;e+=16)i=l,a=g,d=v,h=m,g=f(g=f(g=f(g=f(g=c(g=c(g=c(g=c(g=u(g=u(g=u(g=u(g=o(g=o(g=o(g=o(g,v=o(v,m=o(m,l=o(l,g,v,m,n[e],7,-680876936),g,v,n[e+1],12,-389564586),l,g,n[e+2],17,606105819),m,l,n[e+3],22,-1044525330),v=o(v,m=o(m,l=o(l,g,v,m,n[e+4],7,-176418897),g,v,n[e+5],12,1200080426),l,g,n[e+6],17,-1473231341),m,l,n[e+7],22,-45705983),v=o(v,m=o(m,l=o(l,g,v,m,n[e+8],7,1770035416),g,v,n[e+9],12,-1958414417),l,g,n[e+10],17,-42063),m,l,n[e+11],22,-1990404162),v=o(v,m=o(m,l=o(l,g,v,m,n[e+12],7,1804603682),g,v,n[e+13],12,-40341101),l,g,n[e+14],17,-1502002290),m,l,n[e+15],22,1236535329),v=u(v,m=u(m,l=u(l,g,v,m,n[e+1],5,-165796510),g,v,n[e+6],9,-1069501632),l,g,n[e+11],14,643717713),m,l,n[e],20,-373897302),v=u(v,m=u(m,l=u(l,g,v,m,n[e+5],5,-701558691),g,v,n[e+10],9,38016083),l,g,n[e+15],14,-660478335),m,l,n[e+4],20,-405537848),v=u(v,m=u(m,l=u(l,g,v,m,n[e+9],5,568446438),g,v,n[e+14],9,-1019803690),l,g,n[e+3],14,-187363961),m,l,n[e+8],20,1163531501),v=u(v,m=u(m,l=u(l,g,v,m,n[e+13],5,-1444681467),g,v,n[e+2],9,-51403784),l,g,n[e+7],14,1735328473),m,l,n[e+12],20,-1926607734),v=c(v,m=c(m,l=c(l,g,v,m,n[e+5],4,-378558),g,v,n[e+8],11,-2022574463),l,g,n[e+11],16,1839030562),m,l,n[e+14],23,-35309556),v=c(v,m=c(m,l=c(l,g,v,m,n[e+1],4,-1530992060),g,v,n[e+4],11,1272893353),l,g,n[e+7],16,-155497632),m,l,n[e+10],23,-1094730640),v=c(v,m=c(m,l=c(l,g,v,m,n[e+13],4,681279174),g,v,n[e],11,-358537222),l,g,n[e+3],16,-722521979),m,l,n[e+6],23,76029189),v=c(v,m=c(m,l=c(l,g,v,m,n[e+9],4,-640364487),g,v,n[e+12],11,-421815835),l,g,n[e+15],16,530742520),m,l,n[e+2],23,-995338651),v=f(v,m=f(m,l=f(l,g,v,m,n[e],6,-198630844),g,v,n[e+7],10,1126891415),l,g,n[e+14],15,-1416354905),m,l,n[e+5],21,-57434055),v=f(v,m=f(m,l=f(l,g,v,m,n[e+12],6,1700485571),g,v,n[e+3],10,-1894986606),l,g,n[e+10],15,-1051523),m,l,n[e+1],21,-2054922799),v=f(v,m=f(m,l=f(l,g,v,m,n[e+8],6,1873313359),g,v,n[e+15],10,-30611744),l,g,n[e+6],15,-1560198380),m,l,n[e+13],21,1309151649),v=f(v,m=f(m,l=f(l,g,v,m,n[e+4],6,-145523070),g,v,n[e+11],10,-1120210379),l,g,n[e+2],15,718787259),m,l,n[e+9],21,-343485551),l=t(l,i),g=t(g,a),v=t(v,d),m=t(m,h);return[l,g,v,m]}function a(n){var t,r="",e=32*n.length;for(t=0;t<e;t+=8)r+=String.fromCharCode(n[t>>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var e=8*n.length;for(t=0;t<e;t+=8)r[t>>5]|=(255&n.charCodeAt(t/8))<<t%32;return r}function h(n){return a(i(d(n),8*n.length))}function l(n,t){var r,e,o=d(n),u=[],c=[];for(u[15]=c[15]=void 0,o.length>16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r<n.length;r+=1)t=n.charCodeAt(r),e+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this);
md5.js
Email接收验证码,以实现登录/注册/修改密码的更多相关文章
- node+mysql+express实现登录/注册/修改密码/删除用户 接口
实现用户的注册.登录.修改密码.删除用户操作 用到的数据库:nodecms:表:user 目录结构: db目录下存放数据库操作语句: userSQL.js 用户有关的操作语句 router目录 接口路 ...
- Web实现数据库链接的登录注册修改密码功能
/** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)
1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...
- python-登录-注册-修改密码
该脚本实现了,登录,注册,修改密码功能. #!/usr/bin/env python # -*- coding:utf-8 -*- #pangguoping import os def login(u ...
- 使用手机登录OWA修改密码的问题
最近发现使用手机端登录OWA,安卓手机是可以修改密码的,如图1,但是iPhone就不成,safari和第三方都不可以,如图二. 图一 图二
- Mysql 免密码登录,修改密码及忘记密码操作
----免密码登陆 方式一 my.cnf增加[client]标签 [client] user="root" password="你的密码" 单对定义不同的客户端 ...
- mysql免密登录和修改密码
(1)停止mysql服务 /etc/init.d/mysqld stop (2)跳过密码验证 mysqld_safe --skip-grant-tables & ( ...
随机推荐
- undefined symbol: PyFPE_jbuf
参考: https://blog.csdn.net/ture_dream/article/details/52733326 报错确实是Python的版本不一致. 但是我又不想删除anaconda. 怎 ...
- TinkPHP框架学习-03模型类
1-----数据访问 2-----数据查询 3-----数据添加 4-----数据修改 5-----数据删除 创建一张nation表并写入三条测试数据 create table nation( `co ...
- STS 安装SVN插件
1:STS中 Help->Eclipse MarketPlace 搜索svn点击go安装svn插件,然后重启STS. 2:如果Team中出现SVN说明安装好了一半. 3: 手动安装SVN Con ...
- QT 二维图形 原理、发展及应用
转载自 网易博客:sun的博客 http://zhouyang340.blog.163.com/blog/static/3024095920126710504178/ 2D绘图 Qt4中的2D绘图部分 ...
- mysql 增加时间字段
alter table sign_customer add COLUMN update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE ...
- socket.io诡异的问题
在socket.io客户端连接的时候,如果传入的query包含“sid”这个键时会报错,不知道具体原因.
- Tomcat 配置文件
Tomcat 的配置文件并不多,由4个 xml 文件组成,分别是 context.xml.web.xml.server.xml.tomcat-users.xml 这几个文件.每个文件都有自己的功能与配 ...
- layui-xtree 设置单选框,只能选一个
以下是js代码,首先获取所有节点,再设置只有当前点击的节点状态为选中状态 $.ajax({ type: 'get', url: url, error: function(err){ layer.ale ...
- hbuilder 打包 vueAPP
1:设置状态栏颜色 在manifest.json 找到 plus 下添加 "statusbar": { "immersed": true/*沉浸式状态栏*/ 设 ...
- aop原理及理解
概念 Aspect Oriented Programming,面向切面编程,实际上它是一个规范.一种设计思路,总之是抽象的. 先上图 使用目的 从项目结构上来说 对业务逻辑的各个部分进行隔离,降低业务 ...