使用php/mysql更改密码
我已经为一个示例android应用程序创建了一个注册系统。我可以注册和登录没有任何问题。最后一部分是忘记密码。这是我的逻辑。当用户忘记密码时,他会向我的服务器发送电子邮件,作为回报,他会收到一封电子邮件,告诉他访问链接。这个链接将他带到一个页面,在那里他可以输入并确认他的新密码。由于某些原因,密码没有更新 所以我会在这里发布我的代码 register.php使用php/mysql更改密码,php,android,mysql,passwords,Php,Android,Mysql,Passwords,我已经为一个示例android应用程序创建了一个注册系统。我可以注册和登录没有任何问题。最后一部分是忘记密码。这是我的逻辑。当用户忘记密码时,他会向我的服务器发送电子邮件,作为回报,他会收到一封电子邮件,告诉他访问链接。这个链接将他带到一个页面,在那里他可以输入并确认他的新密码。由于某些原因,密码没有更新 所以我会在这里发布我的代码 register.php <?php session_start(); require "init.php"; heade
<?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);
?>
<?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>
编辑:
以下是我对它的看法:
你的问题似乎出在
$_SESSION['id'];
您仅在创建帐户时设置它,但PHP会话不会持续太长时间。因此,如果您的用户已注册,并且您在会话中存储了行id,那么当他们返回更改密码时,您不能指望它在那里
当您试图查找行以更新密码时(可能)会在幕后发生这种情况
我做到了!!!正如Fred-ii-所建议的,为了选择id,我必须执行一个select查询
<?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{
$select_query = "SELECT id FROM user_info";
$run_select_query = mysqli_query($con,$select_query);
while ($row_post=mysqli_fetch_array($run_select_query)){
$user_id = $row_post['id'];
echo $user_id;
}
$update_posts = "UPDATE user_info SET user_pass='$password',confirm_pass = '$confpassword' WHERE id='$user_id'";
$run_update = mysqli_query($con,$update_posts);
echo "<script>alert('Post Has been Updated!')</script>";
}
}
?>
请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。说。即使是这样也不安全!您不需要在数据库中确认通过。在脚本中检查它们,然后只存储密码(如果它们匹配)。是否检查了错误日志?您假设查询正在运行。在打开后立即将错误报告添加到文件顶部,如果您知道SQL注入错误,但拒绝修复它们,则表明您不关心如何正确执行。电脑是一个严厉的法官,而那些试图侵入电脑的人则更加残忍。第一次就把它做好。不要找借口。使用起来并不难,而且会帮你省去很多麻烦,因为它总是能正确地逃脱。这不是问题所在。你是对的,我进一步看了一下,并用我的答案进行了编辑,指出了另一个可能的弱点。你的逻辑似乎有点错误。大多数网站会生成一个随机的长唯一字符串,然后将其临时保存到数据库(用户表)(24小时左右),然后向您发送包含该字符串的链接。差不多。然后,他们会在他们的用户表中查找字符串SELECT*FROM users WHERE password_reset_token='qwe9019012391-239-soadi',然后使用它更新用户。这是公认的做那样事情的方式。不是通过会话:)和SQL注入。。网上有大量的教程。“这里不需要解释。”亚沃基洛夫的建议很好,西奥。我自己使用一个表,其中存储(从生成的)唯一令牌,然后在用户从发送的链接中验证后将其删除。保留“密码不受保护”!=正在测试SQL注入。@Fred-ii-。对密码现在已更新。但是,我的android不允许我登录:(。当我第一次注册时,我可以登录。问题出现在更新密码后。