【发布时间】:2016-08-14 23:20:06
【问题描述】:
我已经为一个示例 android 应用程序创建了一个注册系统。我可以注册和登录没有任何问题。最后一部分是忘记密码。这是我的逻辑。当用户忘记他的密码时,他将他的电子邮件发送到我的服务器,作为回报,他会收到一封电子邮件,告诉他访问一个链接。该链接将他带到一个页面,他可以在其中输入并确认他的新密码。出于某种原因,虽然密码没有更新。
所以我将在这里发布我的代码。
register.php
<?php
session_start();
require "init.php";
header('Content-type: application/json');
$id = $_POST['id'];
$email = $_POST['email'];
$user_name = $_POST['user_name'];
$user_pass = $_POST['user_pass'];
$passwordEncrypted = sha1($user_pass);
$confirmPass = $_POST['confirm_pass'];
$confPasswordEncrypted = sha1($confirmPass);
$msg = "Congratulations. You are now registered to the most amazing
app ever!";
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$don = array('result' =>"fail","message"=>"Please enter a valid email");
}
if($email && $user_name && $user_pass && $confirmPass && filter_var($email, FILTER_VALIDATE_EMAIL)){
$sql_query = "select * from user_info WHERE email ='".mysqli_real_escape_string($con, $email)."' or user_name
='".mysqli_real_escape_string($con, $user_name)."'";
$result = mysqli_query($con, $sql_query);
$results = mysqli_num_rows($result);
if ($results){
$don = array('result' =>"fail","message"=>"Email or username exists.");
}else{
$sql_query = "insert into user_info values('$id','$email','$user_name','$passwordEncrypted','$confPasswordEncrypted');";
if(mysqli_query($con,$sql_query)){
$don = array('result' =>"success","message"=>"Successfully registered!Well done");
mail($email,"Well done. You are registered to my sample app!",$msg);
$_SESSION['id'] = mysqli_insert_id($con);
}
}
}else if(!$email){
$don = array('result' =>"fail","message"=>"Please enter a valid email");
}else if(!$user_name){
$don = array('result' =>"fail","message"=>"Please enter your username");
}else if(!$user_pass){
$don = array('result' =>"fail","message"=>"Please enter a password");
}else if(!confirmPass){
$don = array('result' =>"fail","message"=>"Please confirm your password");
}
echo json_encode($don);
?>
还有changepassword.php
<?php
require "../init.php";
session_start();
if(isset($_POST['update'])){
$password = $_POST['user_pass'];
$confpassword = $_POST['confirm_pass'];
if($password !== $confpassword){
echo "Passwords don't match!";
}else{
$id = $_SESSION['id'];
if(mysqli_query($con,"UPDATE user_info SET
user_pass='$password',confirm_pass = '$confpassword' WHERE id='$id'")){
echo "Password successfully changed!!!";
}
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="css/login-css.css" media="all"/>
</head>
<body>
<div class="updatepass">
<h1>Update Password</h1>
<form action="" method="post">
<input type="password" name="user_pass" placeholder="Password" required="required" />
<input type="password" name="confirm_pass" placeholder="Confirm Password" required="required" />
<button type="submit" class="btn btn-primary btn-block btn-large" name="update">Update</button>
</form>
</div>
</body>
</html>
关于如何更新密码的任何想法?
谢谢。
【问题讨论】:
-
请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用低于 5.5 的 PHP 版本,您可以使用
password_hash()compatibility pack。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。 -
您的数据库中不需要
confirm_pass。在您的脚本中检查它们,然后只存储密码(如果它们匹配)。 -
您检查过错误日志吗?您正在假设查询正在运行。在您打开
<?php标记error_reporting(E_ALL); ini_set('display_errors', 1);后立即将错误报告添加到文件顶部,在查询中添加错误检查,例如or die(mysqli_error($con))。或者您可以在当前的错误日志中找到问题。 -
如果您知道 SQL 注入错误但拒绝修复它们,这表明您只是不关心是否正确执行。计算机是一个严厉的法官,那些试图入侵它们的人更加残酷。第一次做对。不要找借口。
bind_param使用起来并不难,因为它总是能正确转义,所以可以省去很多麻烦。
标签: php android mysql passwords