2012-02-16 10 views
1

PHPでMySQLデータベースのユーザ名とパスワードをチェックし、検証が成功した後にセッションとして保存する関数を書きました。しかし、入力ボックスにどのような値を入力しても、それを承認してログインに成功しました。私のログインコードは、このコードで間違っていると、なぜそれが機能していないものを私に教えてくださいユーザー名とパスワードの検証はPHPでは動作しませんか?

function queryByUserAndPass($tableName, $username, $password){ 
    $queryStatement = "SELECT * FROM ".$tableName." WHERE username='".$username."' 
         AND password='".$password."' LIMIT 1"; 
    return $queryStatement; 
} 

function checkLogIn() { 

    if(isset($_POST['submit'])){ 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $queryState = queryByUserAndPass("nepal_users", $username, $password); 
     if($resultQuery = mysql_query($queryState)){ 
      $found_user= mysql_fetch_array($resultQuery); 
      $_SESSION['id']=$found_user['id']; 
      $_SESSION['username']=$found_user['username']; 
      $message="succesful log in ".$_SESSION['username']; 
      header("location:home.php"); 
      exit; 
     }else { 
      $message="error in log in"; 
     }  

    } 

} 

あり、ここで

動作しません。

+1

機能queryByUserAndPass($ tableNameの、$ユーザ名、$パスワード){ \t \t $ queryStatement = "SELECT * FROM" $ tableNameの」WHEREユーザー名=」 "$ username"と入力してください。 "$ username"。 \t \t return $ queryStatement; \t} – monk

+1

ユーザーのパスワードに暗号化がありませんか?同じ方法を適用する必要があります。 – mlinuxgada

+0

session_start()でセッションを初期化しました。 –

答えて

0

ユーザー名とパスワードが正しいかどうかを確認しないでください。

if($resultQuery = mysql_query($queryState)){ 
     $found_user = mysql_fetch_array($resultQuery); 
     if ($username === $found_user['username'] && 
      $password === $found_user['password']) { 
      $_SESSION['id']=$found_user['id']; 
      $_SESSION['username']=$found_user['username']; 
      $message="succesful log in ".$_SESSION['username']; 
      header("Location: home.php"); 
      exit; 
     } else { 
      echo "wrong username or password"; 
     } 
    }else { 
     $message="error from database: " . mysql_errno($resultQuery); 
    } 

重要な注意

コード上記のコード内のロジックの問題がどこにあるかだけ示しています。他に2つの重大な問題があります。

  1. SQL injectionの脆弱性があります。準備されたステートメントを使用するのが一般的です。もしあなたの準備ができていない場合は$SAFE_USER_DATA = array_map('mysql_real_escape_string', $_POST);のようなものを使用し、直接$_POSTのデータを読むのではなく、これを使用してください。そうすれば、悪意のあるユーザーがSQL文を変更してシステムにアクセスすることができなくなります。

  2. 平文としてパスワードを保存しないでください。を保存しました。 SHA1パスワードハッシュが推奨されています。単にmd5($password)を使用しないでください。攻撃者は、簡単にあなたのコードに誤りがある場合は、常に成功した場合に、リソース、またはfalseを返すrainbow tables

+2

ユーザ名とパスワードが 'queryByUserAndPass'関数によって問い合わせに入れられたと仮定することは安全です。 –

+0

@Kolinkあなたが正しいです、私は答えを投稿した後、OPはコメントの中に関数を投稿しました。ただし、ここに示したクイックフィックスもうまくいくはずです。SQLインジェクションとパスワードハッシュの紛失に関する深刻な問題にもかかわらず、.. – Kaii

3

mysql_queryの助けを借りて、それらを復号化することができます。

やりたいことです:。。

$resultQuery = mysql_query($queryState); 
if($found_user = mysql_fetch_assoc($resultQuery)) { 
    // do login stuff 
    // note I used "fetch_assoc" above, because you don't use numeric indices here. 
} 
else $message = "Error"; 
+0

本物の修正のための+1 – Kaii

関連する問題