【问题标题】:Trouble with "Update Password" (Change Password)“更新密码”(更改密码)出现问题
【发布时间】:2021-02-09 00:56:48
【问题描述】:

我刚刚做了一个“更改密码”页面,但它并没有更新数据库中的密码

不管我输入什么,它总是说“密码已更改”

提前感谢您的帮助

问候西蒙

<?php

require_once 'header.php';

session_start();
$con = mysqli_connect('localhost','robinsnest','robinsnest') or die('Unable To connect');
if(count($_POST)>0) {
$result = mysqli_query($con,"SELECT *from members WHERE user='" . $_SESSION["$user"] . "'");
$row=mysqli_fetch_array($result);
if($_POST["currentPass"] == $row["pass"] && $_POST["newPass"] == $row["confirmPass"] ) {
mysqli_query($con,"UPDATE members set pass='" . $_POST["newPass"] . "' WHERE user='" . $_SESSION["$user"] . "'");
$message = "Password Changed Sucessfully";
} else{
 $message = "Password is not correct";
}
}



?>



<html>
<div><?php if(isset($message)) { echo $message; } ?></div>
<form method="post" action="" 
Current Password:<br>
<input type="password" name="currentPassword"><span id="currentPass" class="required"></span>
<br>
New Password:<br>
<input type="password" name="newPassword"><span id="newPass" class="required"></span>
<br>
Confirm Password:<br>
<input type="password" name="confirmPassword"><span id="confirmPass" class="required"></span>
<br><br>
<input type="submit" value ="Change Password">
</form>
<br>
<br>
</html>

【问题讨论】:

  • 如果需要,我有一个带有表、用户和密码的数据库
  • 您似乎以纯文本形式存储密码,所以我先看看password_hash()password_verify()
  • 您的表单字段名称也与您在$_POST 中用于处理数据的名称不匹配。您可以使用var_dump() 自行调试。
  • 你也很容易受到 SQL 注入的攻击
  • 老实说,这里有很多错误。您存储的是纯文本密码,而不是使用 PHP 的内置密码散列功能,您对 SQL 注入持开放态度,这意味着您的 SQL 代码可能是任何东西,并且您没有检查错误执行数据库查询后。不管 PHP 教程教了你什么,放弃它并找到其他的。

标签: php database passwords


【解决方案1】:

将您的代码放在这样的 try catch 中:

try{
    //your code
} catch (Exception $ex) {
    var_dump($ex->getMessage());
}

它会告诉你出了什么问题

【讨论】:

    【解决方案2】:

    需要使用prepared statements,因为您目前容易受到 SQL 注入的影响。

    在将它们放入数据库之前,您应该做的另一件事(出于安全目的)是hashing your passwords。不要将密码等内容以纯文本形式放入数据库中。

    password_hash($passwordEntered, PASSWORD_BCRYPT);
    

    如果您愿意,您还可以为密码哈希添加额外的选项。

    每当用户登录时,您都可以使用password_verify 检查用户输入的密码是否与数据库中的哈希值匹配。

    password_verify($passwordEntered, $hashFromDatabase);
    

    应该工作。我在这段代码 sn-p 中使用了准备好的语句,但没有对密码进行哈希处理。您需要用这个替换 session_start() 下的所有 PHP。

    // create new mysqli connection
    $con = new mysqli('localhost', 'username', 'password', 'robinsnest');
    
    // check if the sql credentials are valid
    if ($con->connect_errno) {
      echo "Failed to connect to MySQL: (" . $con->connect_errno . ") " . $con->connect_error;
    }
    
    // prepared statement
    $stmt = $con->prepare("SELECT * FROM members WHERE user=? LIMIT 1");
    
    // view all paramters here:
    // https://www.php.net/manual/en/mysqli-stmt.bind-param.php
    // i is integer
    // d is float
    // s is string
    // b is blob
    $stmt->bind_param("s", $_SESSION["$user"]);
    
    // execute
    $stmt->execute();
    
    // get the results
    $result = $stmt->get_result();
    
    while ($row = $result->fetch_assoc()) {
      if ($_POST["currentPass"] == $row["pass"] && $_POST["newPass"] == $row["confirmPass"]) {
        $updateStmt = $con->prepare("UPDATE members SET pass=? WHERE user=?");$stmt->bind_param("s", $_SESSION["$user"]);
        $updateStmt->bind_param("ss", $_POST["newPass"], $_SESSION["$user"]);
        $updateStmt->execute();
        $message = "Password changed successfully!";
      } else {
        $message = "Password is incorrect.";
      }
    }
    

    【讨论】:

    • OP 还需要修复错误的表单字段名称。
    • 我收到错误“在 null 上调用成员函数 prepare()”
    • @SSC 我有一些变量命名不正确,现在试试。
    • 嗯,它有效;我制作了一个名为 Password_change.php 的文件(使用您的 php 脚本)并替换为 action=""(action"Password_change.php"。但是,当我单击页面上的提交按钮时,什么也没有发生(php -file 只是在一个白页中打开,对于 php 来说有点新手)
    • @SSC 你考虑过使用 ajax 吗?
    【解决方案3】:

    “SELECT *from members WHERE”查询错误正确的查询字符串“SELECT * from members....”。

    你应该在“*”和“from”之间打断

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多