1

正確な技術用語についてはよくわからないので、タイトルで失礼しますが、ここに問題があります。MySQL データベースがあり、user テーブルには *user_name*、*password_salt*、およびパスワードとソルトを含むmd5パスワードがあります。プログラムでは、ユーザーが接続し、ユーザーを検証するために送信する 1 つのクエリを取得します。ユーザーが接続するときに、user_name を選択し、指定されたパスワードを保存されているパスワードと比較する方法が必要です。これには、WHERE ステートメントのどこかでソルトを取得する必要があります (推測します)。

これは私の仮説的な「例」です。

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5((select password_salt FROM users where user_name='$nick')))) 
LIMIT 1

解決策の更新: 問題は、ポートが指定されていない限り、sql-auth API がパスワードを受信して​​いないことでした。

4

3 に答える 3

1

実は FROM 句で宣言されたテーブルの任意の列を SELECT 句だけでなく WHERE 句でも自由に使用できるので、ここでサブクエリを行う必要はないと思います。簡単にしましょう:

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5(password_salt))) 
LIMIT 1

このようにして、次の両方に一致する場合にのみ行が選択されます。 - ユーザー名が正しい - 行のパスワードが指定されたパスワードと一致する

md5() 関数を正しく使用したかどうかはわかりません。あなたの例をコピーしました。

于 2012-07-22T20:15:11.270 に答える
0

SELECT user_name FROM users WHERE user_name='$nick' AND password = md5(CONCAT('$md5pass', password_salt)) LIMIT 1

于 2012-07-22T20:15:00.223 に答える
0

代わりにこれを試してください:

SELECT user_name 
FROM users 
WHERE user_name='$nick' AND 
      password = md5(CONCAT('$md5pass', md5(password_salt))) 
LIMIT 1
于 2012-07-22T20:15:48.147 に答える