2011-02-18 4 views
-1

1つのmysqlクエリで、ユーザ名とパスワードのどちらが間違っているかを確認したいのですが。ユーザー名またはパスワードのどちらが間違っているかを確認するにはどうすればよいですか?

シナリオ:

ユーザーがユーザー名とパスワードとクリックを提出し、私は1つが正しくないエラーメッセージを表示したいです。私はこのためのシンプルで最適化されたクエリが必要です。

+4

何を試しましたか?あなたの質問はあまりにも広すぎ、適切に答えるのが曖昧です。 –

+6

あなたはどちらが間違っているかを表示したくありません。ペアが間違っているかどうかを確認したい場合は、攻撃者が有効なユーザー名を簡単に見つけられるようにします。 –

+5

私は「あなたのパスワードは正しかったが、あなたのユーザー名が間違っています」というエラーメッセージが表示されるのが好きです。 – Gareth

答えて

4

一般的な経験則として、ユーザー名またはパスワードが間違っていると攻撃者に知らせないので、「ユーザー名またはパスワードが間違っています」というメッセージをユーザーに返すほうがよいと言います。

3

これは、攻撃者が有効なユーザー名を見つけられる優れた方法です。

は、あなたの質問に答えるために、私はあなたが

SELECT username, password WHERE username=? OR password=? 

を行い、その後、正しいものを見つけるために、指定されたユーザー名とパスワードを使用して結果を経る必要があるだろうと思います。

+0

ここでは平文のパスワードを主張していないので注意してください – Gareth

0

コード::

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

     } 
    mysql_select_db("My_TABLE_NAME", $con); 
    $Username = $_POST['Username']; // get username 
    $Password = $_POST['Password'] ; // get pwd 

    $sql="SELECT Username FROM My_TABLE_NAME WHERE Username=’".$Username.”’ and Password=’”.$Password.”’”; 
    $r = mysql_query($sql); 
    if(!$r) { 
     $err=mysql_error(); 
     print $err; 
     exit(); 
    } 
    if(mysql_affected_rows()==0){ 
     print "no such login in the system. please try again."; 
     exit(); 
    } 
    else{ 
     print "successfully logged into system."; 
     //proceed to perform website’s functionality – e.g. present information to the user 
    } 
    ?> 
もちろん
1
$query = <<<EOL 
SELECT IF(password = '$password', 1, 0) 
FROM users 
WHERE username='$username' 
EOL; 

$result = mysql_query($query) 
if (mysql_numrows($result) == 0) then 
    echo 'Bad username'; 
} else { 
    $row = mysql_fetch_array($result); 
    if ($row[0] == 0) then 
    echo 'Bad password'; 
    } 
} 

、これは$ユーザ名と$パスワードが適切にエスケープされていることを前提としていて、その$パスワードがにマッサージされた以下のPOSTメソッドを使用してHTMLフォームを使用してくださいそれをDBに保存するために使用しているハッシュ/暗号化方式に関係なく。

関連する問題