2011-10-12 4 views
0

何らかの理由で私のチェック用のログインスクリプトがゲストを招待しています。ゲストのログインスクリプトを確認しますか?

私はサイトをまだ生きているわけではありません。

ユーザーがHTMLフォームに入力したユーザー名とパスワードをデータベースでチェックしますが、何らかの理由で結果が得られない場合でもユーザー名はnilに設定されます ユーザー名にユーザー名を追加しますが、結果が得られない場合はユーザー名を何も設定しません。

私はif文を持っていますが、それでも設定しています。

$myusername = mysql_real_escape_string($_POST['myusername']); 
$mypassword = mysql_real_escape_string($_POST['mypassword']); 


$sql  = "SELECT * FROM users WHERE username='$myusername'"; 
$result  = mysql_query($sql) or die(mysql_error()); 
$battle_get = mysql_fetch_array($result);  

if ($battle_get['password'] == $mypassword) 
{  
    $_SESSION['username'] = $myusername ; // store session data  
    header('Location: http://mydomainname.net/new_rpg/dashboard.php');  
} else { 
    echo "wrong password" ; 
} 
+1

** 1)**なぜあなたはハッシュとしてパスワードを保存しないでください。? ** 2。)**その後、パスワードをエスケープする必要はありません。 ** 3。)** MySQL側でパスワードを確認してみませんか? ** 4。)**テストのためにキャッシュをクリアしましたか? – ComFreek

+0

はいiveキャッシュをクリアし、急いでいました。私はmd5を作るのが嫌いです。そして、私は逃げても構いません。私はスクリプトを安全にするためにその部分を見つけます。 –

+0

パスワードをハッシュした後は、もうパスワードをエスケープする必要はありません。 16進文字列になります。さらに、他の(より安全な)ハッシュアルゴリズムが利用可能です(['hash()'](http://php.net/manual/function.hash.php)を参照) – ComFreek

答えて

0

Yurミス:

は、私は、ユーザーではないよと言います。

従って$battle_get['password'] = false;

$mypasswordfalseあり、

ので$battle_get['password']は、あなたがこの問題を解決することができます$mypassword

双方向に等しいです。

はまず、SQLとパスワードをチェク:

$sql = "SELECT * FROM users WHERE username='$myusername' AND password = '$mypassword'";

または

if(!$battle_get) { 

echo "wrong password" ; 

} 
+0

** http://php.net/ faq.passwords ** – hakre

2

ユーザーアカウントが実際に存在するかどうかを確認しません。結果セットにNOレコードが含まれていても、結果セットから行を盲目的にフェッチするだけです。つまり、$battle_getは空の配列になります(クエリが失敗した場合はfalse)。次に、送信されたパスワードと文字列比較を行います。そのパスワードも空である場合、あなたは...、ユーザーの中にif (empty == empty)とブームをやっている

あなたがやるべきことは何である:多くの行が返されたかを確認する

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

$sql = "SELECT ... FROM users WHERE (username = '$username') AND (password = '$password')"; 
$result = mysql_query($sql) or die(mysql_error()); 

if (mysql_num_rows($sql) != 1) { 
    die("Invalid username and/or password"); // don't tell the user which failed. 
} 

は重要である - ノー場合。行が返された場合、ユーザーは存在しないか、パスワードが間違っています。 1行が返された場合、有効なログインです。複数の行が返された場合は、データベースにユーザー名とパスワードのペアが重複していますので、すぐに修正する必要があります。

上記の「md5 is hard」のコメントを見ただけで、あなたは間違っています。 MD5はとても簡単です。ユーザーレコードを作成するとき

、あなたは簡単にパスワードをハッシュすることはできません。

INSERT INTO users (password) VALUES (MD5('$password')); 

とログインのチェックのために:すべてでそれに

SELECT ... WHERE (password = MD5('$password')); 

何も。

+0

mysql_real_escape_stringは便利ですが、パラメータ化されたクエリが役立ちます。この記事をチェックしてくださいhttp://spotthevuln.com/2011/08/boundaries-sql-injection/またSha1はmd5よりも安全なハッシュであり、使い方も簡単です。sha1($ Password) – CountMurphy

+0

彼らはどこに適用されるのかについて細かいやりがいはありませんが、単に働くことができないたくさんの質問があります。 –

+0

どうですか?私は何の問題も聞いたことがない、と私は間違いなくページにログインするために使用するだろう – CountMurphy

関連する問題