这些PHP if语句是否有逻辑错误?

时间:2012-11-03 18:46:56

标签: php mysql if-statement logic

下面是单击表单的“更改密码”按钮时运行的脚本。该表单包含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个密码字段为空或不匹配,密码仍会在数据库中更新。为什么会这样的原因?

感谢您提供的任何帮助。

3 个答案:

答案 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传递,要么变量名称不正确。

后续步骤:

  1. 一旦工作,请删除var_dump并取消注释重定向。
  2. 考虑重新编写if语句,以更明确地测试密码是否正确,如其他答案中所述。
  3. 说真的,请查看PDOmysqli。程序mysql_ *正在被删除。
  4. 如果您不想使用完整的OOP路由,请考虑使用update_password()和send_error()等函数。它会使您的代码更具可读性和可重用性。
  5. 但是一步一步,让我们调试这个当前的东西!

答案 2 :(得分:0)

我找不到具体原因,为什么这不起作用(尝试使用调试器或调试消息),但我肯定不会把我的密码更新放在'else'分支!只有当您100%确定新密码及其确认匹配并且根据您的密码策略验证密码时,才更新密码。至少可以确保它们不是空字符串。