3

基本的に、登録フォームのパスワードを次のように暗号化しました。

    $query = "INSERT INTO users(first_name, last_name, email, password, 
                         username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')"; 

これでパスワードはハッシュ化されましたが、ログイン スクリプトで使用しようとすると機能しなくなり、関数 mysql_num_rows は 0 を返します。

    <?php
                ob_start();
                    //If login button is pressed
                    if(isset($_POST['submitted'])){
                        //Username clean up
                        if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['username'])))){
                            $u = escape_data($_POST['username']);
                        } else {
                            $u = FALSE;
                            echo '<p><font color="red" size="+1">Please enter valid username</font></p>';
                        }

                        //Password clean up
                        if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['password'])))){
                            $p = escape_data($_POST['password']);
                        } else {
                            $p = FALSE;
                            echo '<p><font color="red" size="+1">Please enter valid password</font></p>';
                        }

                        //Check if both matched
                        if($u && $p){
                            $query = "SELECT * FROM users WHERE username='$u' AND password=SHA('$p')";
                            $result = mysql_query($query);
                            $count = mysql_num_rows($result);
                            $row = mysql_fetch_array($result, MYSQL_NUM);
                            if($count != 0){
                                $_SESSION['username'] = $row[1];
                                $_SESSION['password'] = $row[3];
                                header("Location: login_confirmed.php");
                            } else {
                                echo "Wrong username or password!";
                            }
                        } 
                    }
                    ob_end_flush();
                ?>
4

1 に答える 1

1

おそらくパスワードフィールドのタイプが原因です。あなたのパスワード欄はVARCHARですか?それはどのくらい長いですか?フィールドで許可されているよりも長い文字列を生成しているように見えるSHAので、保存時にカットオフされ、再生成して確認すると一致します。

MySQL のドキュメントによると、 の出力を保存するには 40 文字が必要ですSHA

RFC 3174 (セキュア ハッシュ アルゴリズム) の説明に従って、文字列の SHA-1 160 ビット チェックサムを計算します。値は 40 桁の 16 進数の文字列、または引数が NULL の場合は NULL として返されます。この関数の可能な用途の 1 つは、ハッシュ キーとしてです。

于 2013-07-09T12:25:13.090 に答える