【问题标题】:Changing password using php/mysql使用 php/mysql 更改密码
【发布时间】: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。在您的脚本中检查它们,然后只存储密码(如果它们匹配)。
  • 您检查过错误日志吗?您正在假设查询正在运行。在您打开&lt;?php 标记error_reporting(E_ALL); ini_set('display_errors', 1); 后立即将错误报告添加到文件顶部,在查询中添加错误检查,例如or die(mysqli_error($con))。或者您可以在当前的错误日志中找到问题。
  • 如果您知道 SQL 注入错误但拒绝修复它们,这表明您只是不关心是否正确执行。计算机是一个严厉的法官,那些试图入侵它们的人更加残酷。第一次做对。不要找借口。 bind_param 使用起来并不难,因为它总是能正确转义,所以可以省去很多麻烦。

标签: php android mysql passwords


【解决方案1】:

我做到了!!!正如 Fred -ii- 建议的那样,我必须进行选择查询才能选择 id。所以。

<?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>";
    }

}
?>

但我还是想保留密码“不受保护”,因为我想了解 sql 注入的工作原理:):)。如果您发现任何其他内容,请发表评论..

【讨论】:

  • 你的逻辑似乎有点不对劲。大多数网站会生成一个随机的长 UNIQUE 字符串,然后将其临时(24 小时左右)保存到数据库(用户表),然后向您发送包含该字符串的链接。像example.com/reset.php?string=qwe9019012391-239-soadi 这样的东西。然后他们会在他们的用户表中查找字符串 SELECT * FROM users WHERE password_reset_token='qwe9019012391-239-soadi',然后使用它来更新用户。这是做类似事情的公认方式。不是通过会话 :) 和 SQL 注入 .. 网络上有大量教程。这里不用解释了。
  • @YavorKirov 的建议是一个很好的 Theo。我自己使用一个表来存储唯一令牌(从生成的),然后在用户从发送的链接中验证后从中删除。
  • “密码不受保护” != 测试 SQL 注入。
  • @Fred -ii-。是的。现在密码已更新。但是,我的android不让我登录:(。第一次注册时,我可以登录。更新密码后出现问题。
【解决方案2】:

已编辑:

这是我的看法:

您的问题似乎与

$_SESSION['id'];

您仅在创建帐户时设置它,但 PHP 会话不会持续太长时间。因此,如果您的用户已注册并且您将行 ID 存储在会话中,那么当他们返回更改密码时,您不能指望它在那里。

这(可能)是当您尝试查找行以更新密码时在幕后发生的事情

http://prntscr.com/av3320

【讨论】:

  • 这不是问题
  • 你说得对,我进一步查看并编辑了我的答案以指出另一个可能的弱点。
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2014-12-10
  • 2012-02-12
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多