0

我有以下代码,它不起作用。我目前正在为系统开发一个简单的更改密码功能,但无法使其正常运行。我想知道我是否忽略了一个非常简单的解决方案?

<?php    
    $con = mysql_connect("localhost","root");
    if (!$con) {
        die('Could not connect: ' . mysql_error());
    }

    $username = $_POST['userid'];  
    $password = $_POST['cpword'];
    $newpassword = $_POST['pword'];
    $confirmnewpassword = $_POST['pword2'];

    $result = mysql_query("SELECT username, pword FROM login WHERE username='$username'");

    if(!$result) {
        echo "The username entered does not exist!";
    } else
        if($password != mysql_result($result, 0)) {
            echo "Entered an incorrect password";
        }

    if($newpassword == $confirmnewpassword) {
        $sql = mysql_query("UPDATE login SET pword = '$newpassword' WHERE username = '$username'");     
    }

    if(!$sql) {
        echo "Congratulations, password successfully changed!";
    } else {
        echo "New password and confirm password must be the same!";
    }       
?>
4

2 回答 2

5

好的,因为这个危险的脚本会感染互联网,我给你一些建议。

  1. 使用哈希来保存密码,没有人想要一个可见的密码。
  2. 永远不要告诉用户你的数据库中有什么,就像Entered an incorrect password通知告诉我我找到了一个用户名,所以我的暴力破解要容易 100 倍。
  3. 而全网的人喊的是:STOP USING MYSQLStep to PDO or mysqli
  4. 最后但同样重要的是:听说过mysql 注入吗?
于 2012-09-11T14:34:09.607 回答
0

好的,这段代码有很多问题,所以我将它重写为最新的并且一点也不危险(大部分)。

我没有像你真正应该的那样在这里对密码进行哈希处理,但你可以通过一些阅读来非常简单地做到这一点(试试这个:PHP密码的安全哈希和盐

有关这些问题的确切问题和解决方案的完整列表,请查看@Bondye 的帖子或对 OP 问题的评论。

免责声明:未经测试,因此可能存在一些语法错误。这仍然不是很棒,但它是比原始代码更好的起点。请参阅下面的列表,了解我所做的更改以及原因。

开始...

<?php
    $host = "localhost";
    $database = "yourdatabase";
    $username_db = "root";
    $password_db = "databasepassword";
    $con = mysqli_connect($hostname, $username_db, $password_db, $database) or die(mysqli_error($con));

    $username = $_POST['userid'];  
    $newpassword = $_POST['pword'];
    $confirmnewpassword = $_POST['pword2'];

    if($newpassword == $confirmnewpassword)
    {
        //password & password confirm match, do the update
        $query = sprintf("UPDATE login SET pword=%s WHERE username=%s",
                          mysql_real_escape_string($newpassword),
                          mysql_real_escape_string($username));                    
        $sql = mysqli_query($query, $con) or die(mysqli_error($con);     
        if($sql)
        {
            echo "Congratulations, password successfully changed!";
        } 
        else
        {
            //sql error or update didn't work?
            echo 'generic failure message';
        }        
    }
    else
    {
        //new password and confirm password weren't the same.
        echo "New password and confirm password must be the same!";
    }    

?>

更改:删除查询以查找用户名 - 确实是个人选择,但当您要在update查询中对该用户进行隐式搜索时,我没有看到查询数据库以查看用户是否存在的意义。其次,您应该在他们可以访问此脚本之前登录他们,因此应该没有关于用户是否存在的问题。

mysql将功能更改为mysqli等效项。

简化并清理了混乱的if测试,并将验证放在查询本身之前。这更好,因为您不应该告诉您的用户您的数据库中有什么,因为这对于攻击者来说是有用的信息,而对于此时应该已经登录的用户完全没有用处。

希望这会有所帮助并接受更正。

于 2012-09-11T14:51:23.763 回答