2011-11-17 7 views
6

ユーザーデータを更新するためのフォームがあります。これは、このページにポスト:予期しない結果を生成するクエリ(sha1)

<?php 
    //Update user table 
    session_start(); 
    include 'sql_connect_R.inc.php'; 

    $id = mysql_real_escape_string($_POST['userID']); 
    $password = mysql_real_escape_string($_POST['user_passwrd']); 

    $salt = time(); 
    $hash = sha1($password . $salt); 

    mysql_query("UPDATE users SET user_passwrd = '$hash', stamp = '$salt', pending = 'yes' 
    WHERE userID = '$id'"); 

    mysql_close($con); 
?> 

(私はこの質問に適切なものではなくて編集した)

を私は何が起こっているのかと考えている、それは「スタンプ」欄は、$塩が移入されているときであります$ハッシュが計算されているときとは異なる値を取得しています。私は$ numはエコーとき

$qry="SELECT * FROM users WHERE userlogin = '$login' AND user_passwrd = sha1(CONCAT('$password', stamp))"; 
    $result=mysql_query($qry); 
    $row = mysql_fetch_assoc($result); 
    $num = mysql_num_rows($result); 

それは$の値が残って塩を確実にする方法がある場合、私は思ったんだけど0 の値を返します。このため、ユーザーのサインで、ここでチェックされていますそれが$ hashで使用されているときと同じとき、そしてそれがフィールド 'スタンプ'を更新しているとき。 誰でもこれを手伝ったり、正しい方向に私を指揮することはできますか?前もって感謝します。 乾杯

+0

PHPが間違ったハッシュを挿入したか、またはMYSQLが間違ったハッシュを探しているかを確認してください。それは問題空間を半分に分割します。 –

+0

間違ったハッシュが挿入されています。私は、パスワードがハッシュされているときの$ saltの値と、データベースに挿入されているときの$ saltの値との間に違いがあると思うが、本当にわからない。 – Spud

+0

'user_passwrd'のカラム定義とは何ですか? – Ben

答えて

0

コメントありがとうございます。私は問題を「解決した」と報告したい。ある夜遅くパスワード入力フィールドの名前を変更し、$ _POST値を変更しなかった。もちろんこれは$ハッシュに$ passwordの値を指定しなかったのです。私はこれに恥ずかしいですが、エラーが発生するすべての場所をチェックすることがいかに重要であるかを実証するために私の監督を分かち合うことは重要です。私はすべてを二重チェックすることに失敗し、問題の性質について誤った仮定をしました。コードはうまくいきました。問題を引き起こしたのはキーボードの前にある緩いネジでした。歓声

1

もっとアイデアは私は答えに私のコメント...それは保存するときにPHPのSHA1関数を使用しているが、MySQLのは、取り出すときにということは注目に値します

を変更しました。それらは同じでなければなりませんが、これをデバッグするために私が見たい最初の場所です。 mysqlのsha関数を使用してハッシュを保存するか、ログインに基づいてレコードを取得してみてください。比較のために塩で読み取ってハッシュしてください。

どのようにタイムスタンプを保存していますか?何らかの形で日付ストリングとして変換/丸め/切り抜き/処理されている可能性はありますか?サニティチェックのために、両方のステップでsha1関数に入力している文字列を取り込み、それらが同一であることを確認します。

あなたのコメントに加えて、関連するフィールドのスキーマをテーブルに投稿できますか?

+0

user_passwrd \t VARCHAR(60)\tません/ \t スタンプ\tのint(50)\tありません...それは$塩の値は、パスワードをハッシュ化された時、それは「切手に挿入された時とで異なることは可能です'フィールド? – Spud

+0

'time()'を直接(2回)呼び出していて、それを変数に格納するのであれば、それは単なる数値です。 mysqlの 'INSERT'の後に' $ salt'を出力してから、それをDb – Basic

+0

に保存されている値と比較してください。更新の前後で同じです。今私は本当に困っている。 – Spud

-1

あなたの質問は間違っています。文字列内の変数を連結し、一重引用符を使用しないでください。 1つのキー ``の左にある引用符を使います。これは、ほとんどのMySQLがクエリを読み込む方法です。例:

<?php 
     //Update user table  
session_start();  
include 'sql_connect_R.inc.php';   
$id = mysql_real_escape_string($_POST['userID']);  
$password = mysql_real_escape_string($_POST['user_passwrd']);   
$salt = time();  
$hash = sha1($password . $salt);   
mysql_query("UPDATE `users` SET `user_passwrd` = '".$hash."', `stamp` = '".$salt."', `pending` = 'yes' WHERE `userID` = '".$id."'");   
mysql_close($con); 
?> 

$qry="SELECT * FROM `users` WHERE `userlogin` = '".$login."' AND `user_passwrd` = '".sha1(CONCAT($password, stamp))".'";   
$result=mysql_query($qry);   
$row = mysql_fetch_assoc($result);   
$num = mysql_num_rows($result); 

この小さな変更が役立ちます。ときどきDBが少し触ってしまうことがあります。私はこれが役立つことを願っています

+0

これは当てはまりません。バッククォートは絶対に必要ではありません(ちょっと、私はそれらを使用することを勧めます)。二重引用符を使用するときに連結する必要はありません。 –

+0

これまで、これを手伝ってくれました。なぜ私は完全にはわからないが、私がそれをバッククォートに変更して変数を連結したとき、すべてがうまくいった。だから私はしばらくこのようにしてきました。これが彼を助けないと誰が言う?私はあなたがその質問に答えるのを見ません。私はただ助けようとしていた。 – jpferrierjr

+1

もちろん、あなたはいましたが、あなたがしていることを知る必要があります。私はあなたや何かを打ち負かそうとしていない。バッククォートの目的は、基本的に列、表、またはデータベース名を「エスケープ」することです。これにより、構造体名にスペースなどの特殊文字を使用したり、予約されたキーワードを使用することができます。明示的な連結は、OPのコードとまったく同じことをしているので、この場合は何も行いません。それ自体ではクエリが機能し、問題は不正なデータです。 (1) –

関連する問題