下面是单击表单的“更改密码”按钮时运行的脚本。该表单包含2个密码字段,一个用于新密码,另一个用于确认新密码。以下是表单的动作脚本:
<?php
session_start();
include("func.php");
$NewPassword = mysql_real_escape_string(md5($_POST['newpassword']));
$Confirm = mysql_real_escape_string(md5($_POST['confirmnewpassword']));
$userid = $_SESSION['username'];
if (!isset($NewPassword) || !isset($Confirm)) {
header("Location: ../error.php");
die("Error");
}else if ($NewPassword <> $Confirm) {
header("Location: ../error.php");
die("Error");
}else{
dbConnect();
mysql_query("UPDATE users SET password='$Confirm' WHERE username='$userid'");
mysql_close($connect);
header("Location: ../profile.php");
die("Success");
}
?>
即使表单上的2个密码字段为空或不匹配,密码仍会在数据库中更新。为什么会这样的原因?
感谢您提供的任何帮助。
答案 0 :(得分:1)
你不需要mysql_real_escape_string包含md5函数,因为md5返回一个十六进制数。
if (!isset($NewPassword) || !isset($Confirm)) {
永远不会评估为true,你应该检查$ _POST ['newpassword']和$ _POST ['confirmnewpassword']是否为空 - 在这种情况下,如果密码都是空的,密码将被更新。
关于即使密码不同也要更新的密码,您是否100%确定使用POST而不是GET传递变量,参数名称是“newpassword”和“confirmnewpassword”?
尝试使用“echo”来显示变量的值,以确保正确传递参数,99%存在问题。
答案 1 :(得分:1)
您的代码中没有任何内容可以防止空字符串被散列和上传。您正在检查哈希值,而不是原始字符串。这可以解释为什么空值仍然会更新。
但是,如果值不匹配,则它们的哈希值应该不同。这将向我表明,您的变量$_POST['newpassword']
和$_POST['confirmnewpassword']
可能不准确。正如其他人所建议的那样,代码开头的var_dump甚至print_r($_POST)语句将帮助您诊断。
如果没有像PDO与mysql这样的大图片问题或者以不同的方式构建代码,那么我会做的就是:
session_start();
include("func.php");
print_r ($_POST); // you'll want to delete this later
$new_password = $_POST['newpassword']; // not technically necessary, my preferred style
$confirm_password = $_POST['confirmnewpassword']; // also not technically necessary
$userid = $_SESSION['username'];
/* Test the actual submitted password and confirmation to ensure they are set */
if (empty ($new_password) || empty ($confirm_password)) {
/* header("Location: ../error.php"); */ // comment this out for now
die ("Error: Password or Password Confirmation not set");
}
/* Test the actual submitted password and confirmation to ensure they match */
elseif ($new_password != $confirm_password) {
/* header("Location: ../error.php"); */ // comment this out for now
die("Error: Password and Password Confirmation do not match");
}
else {
/* NOW that you have established the password and confirmation are both
* set AND match, you get the hash value */
$password_hash = mysql_real_escape_string(md5($new_password));
dbConnect();
mysql_query("UPDATE users SET password='$Confirm' WHERE username='$userid'");
mysql_close($connect);
/* header("Location: ../profile.php"); */ // comment this out for now
die("Success: Updated");
}
这应该允许您调试脚本并查看出错的地方。我的猜测是数据要么作为GET传递,要么变量名称不正确。
后续步骤:
答案 2 :(得分:0)
我找不到具体原因,为什么这不起作用(尝试使用调试器或调试消息),但我肯定不会把我的密码更新放在'else'分支!只有当您100%确定新密码及其确认匹配并且根据您的密码策略验证密码时,才更新密码。至少可以确保它们不是空字符串。