2012-02-24 11 views
0

このログインシステムは安全ですか?このログインシステムはセキュリティ保護されていますか

if ($_POST[$submit]){ 

$user = $_POST[$user]; 
$pass = $_POST[$pass]; 

if ($user && $pass){ //if user and pass is enterered 

     require("vars.php"); //require MySQL conection settings 
     mysql_connect($auth_mysql_server, $auth_mysql_user, $auth_mysql_pass); //connect to MySQL 
     mysql_select_db($auth_mysql_db); // select MySQL database 

     $pass = md5($pass); // hash password 

     $query = mysql_query("SELECT * FROM $auth_mysql_table WHERE user='$user'"); // run query 
     $numrows = mysql_num_rows($query); 

     if ($numrows == 1){ //check if user exists 
      $row = mysql_fetch_assoc ($query); 
      $dbid = $row[$auth_mysql_id_row]; 
       $dbuser = $row[$auth_mysql_user_row]; 
       $dbpass = $row[$auth_mysql_pass_row]; 

       if ($pass == $dbpass){ // if password is equal to the one in the database start session 
        session_start(); 
        //set session information 
        $_SESSION['user'] = $dbuser; 

        header("Location:$auth_loggedin"); // goto logged in page 

       } 
       else return (3); 
     } 
     else return (2); 

     mysql_close(); // close MySql connection 
    } 
    else return (1);} 

どうすれば安全にすることができますか?

私はパスワードをハッシュしましたが、私はmd5が復号化できることを知っていますが、sha1も可能です。また、mysql_close()が必要ですか?

+0

「bcrypt」を参照してください。http://stackoverflow.com/questions/6863410/php-bcrypt-hashing – scibuff

+0

あなたがここに投稿して以来、そうではありません。 – Zyerah

+0

'$ user'変数は、クエリで使用する前にエスケープする必要があります。または、データベース全体を簡単に削除することができます。 –

答えて

3

いいえ安全ではありません。あなたはSQLインジェクション攻撃を開始しています。

SELECT * FROM $auth_mysql_table WHERE user='a'; drop table user; select '1'='1' 
を:誰かがあなたのユーザ入力フィールドにこれを入力した場合、これは、このようなSQL文でしまう

a'; drop table user; select '1'='1 

($ _POST [$ユーザ]に入っている)、何が起こるか想像データベースに対して実行する

を入力します。それは良くないね!

あなたの入力をサニタイズする必要があります。これを読んで:http://php.net/manual/en/security.database.sql-injection.php

編集:relevant

+0

私はそれが安全ではないことに同意しますが、 'mysqli'はあなたが報告した文を実行します。 mysqlをインジェクトするには、MySQLエラーが発生し、エスケープ文字を使用して出力を画面に出力する必要があります。 – Fabrizio

+0

ありがとう、これが私がここに来る理由です! – mindandmedia

+0

うわー、私はそれがどれほど安全でないか分からなかった。おかげさまで、偉大な例の – luke

-1

mysql_closeは必須ではありませんが、それは良い方法です。 PHPはスクリプトの最後に自動的に接続を閉じます。 http://php.net/manual/en/ref.mcrypt.php

あなたはまたに持って心に留めておく :

MD5は、あなたがPHPの暗号化の詳細については、このリンクを参照してください

AES

のようないくつかの他のPHPの暗号化ライブラリを使用することができる最高の暗号化方式ではありません いつも消毒するコード!

MySQLの注入は悪い獣かもしれません!

+0

md5とaesは互換性がありません。md5はハッシュアルゴリズムですが、aes/Rijndaelは暗号です。 – VolkerK

+0

正しいですが、2つの接続がより安全になる可能性があります。 – Fabrizio

5

は、あなたのハッシュに塩を追加します。これは、ランダムな文字列、ユーザーの名前、アカウント作成のタイムスタンプ、またはユーザーが好きなように、与えられたユーザーがログインするたびに同じであればよくなります。まず、レインボーテーブルを破棄します2番目は、通常は短いパスワードにエントロピーを追加します。

$pass = $_POST['pass']; 
$salt = "7y9fhu8a" 
$secure_pass = md5($pass . $salt); 

第2に、ユーザー名の入力を消毒していません。 mysql_real_escape_stringをユーザ名に追加して、SQLインジェクション攻撃を防ぐことができます。

$query = "SELECT * ". 
     "FROM $auth_mysql_table ". 
     "WHERE user='" . mysql_real_escape_string($user) . "'"; 
$result = mysql_query($query); 

は、ユーザー入力をサニタイズする他の方法がありますが、それは迅速かつ汚いです。 mysql_closeが行く限り、私は気にしません。他のクエリを実行する必要がある場合は、接続を再度開く必要があります。

0

いいえ安全ではありません。

ユーザー入力をサニタイズするか、バインド変数を使用する(さらに優れた)必要があります。 PHPのためには、PDOを使用することができます。PHP PDO prepared statements

はまた、無塩MD5は、パスワードをハッシュし、本当のセキュリティを提供しないためひどい選択肢です。塩漬けされたMD5はほんのわずかしかありません(でもひどいカテゴリーにあります)。

次のことを行う必要があり、次のいずれか

  1. あなた自身が、その後ずっと強いハッシュ関数などを使用したパスワードを処理しようとしている場合は任意のpasswords-使用フェデレーションのログイン(OpenIDで、OAuthの、など)
  2. を保存しませんscrypt,bcrypt、またはPBKDF2となります。
関連する問題