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. そして、人々がネット全体で叫ぶのは、PDOまたはmysqliSTOP USING MYSQLへのステップです。
  4. 最後になりましたが、 mysqlインジェクションについて聞いたことがありますか?
于 2012-09-11T14:34:09.607 に答える
0

OK、このコードには多くの問題があるので、最新のコードに書き直しましたが、まったく危険ではありません (ほとんどの場合)。

ここでパスワードをハッシュ化する必要はありませが、少し読むだけで簡単にハッシュ化できます (これを試してください: 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!";
    }    

?>

変更: ユーザー名を探すためのクエリを削除しました - 本当に個人的な選択ですが、クエリでそのユーザーの暗黙的な検索を行うときに、DB にクエリを実行してユーザーが存在するかどうかを確認する意味がわかりませんupdate。次に、ユーザーがこのスクリプトにアクセスする前にログインしておく必要があります。そのため、ユーザーが存在するかどうかについて疑問が生じることはありません。

mysql機能を同等のものに変更mysqli

テストの混乱を簡素化してクリーンアップしif、クエリ自体の前に検証を配置しました。これは攻撃者にとって有用な情報であり、この時点ですでにログインしている必要があるユーザーにとってはまったく役に立たないため、データベースにあるものをユーザーに伝えるべきではないため、これはより良い方法です。

これが役に立ち、修正できることを願っています。

于 2012-09-11T14:51:23.763 に答える