2016-05-03 5 views
0

私は全く新しいPHPmySQLを新しく使用していて、自分のウェブサイト用の小さなログインフォームを作成しました。このようなことについてのインターネット上の記述がはるかに広範であるため、これは安全な方法であるかどうかを尋ねたいのですが、それはほんの数行で、動作します:PHPとmySQLのログインセキュリティに疑問がある

まず、テーブルはphpMyAdminで、ユーザー名とパスワード(ハッシュされたmd5)。その後、次のスクリプトでウェブサイトのログインを実行します。ここでは$_POSTはフォームから来ます。

<?php 
    session_start(); 
    $db = @mysqli_connect("...", "...", "...") or 
    die("Connection failed!"); 
    mysqli_select_db($db,'...'); 
    if(isset($_POST['username'])) 
    { 
     $_SESSION['user'] = $_POST['username']; 
     $_SESSION['password'] = md5($_POST['password']); 
     $user = $_SESSION['user']; 
     $password = $_SESSION['password']; 
     $sql = "SELECT * FROM logins WHERE username = \"$user\""; 
     $result = $db->query($sql); 
     $row = $result->fetch_assoc(); 
     if($row["password"] == $password) 
     { 
      $_SESSION['logged'] = "loggedin"; 
     } 
    } 
?> 

ログアウトスクリプトも非常に簡単です。

<?php 
    session_start(); 
    session_destroy(); 
    unset($_SESSION['user']); 
    unset($_SESSION['password']); 
    header('Location: ../index.php'); 
?> 

また私は

<?php 
    if (isset($_SESSION['logged'])) 
    { 
     $temp = $_SESSION["user"]; 
     echo "Hello $temp, nice to see you!"; 
    } 
?> 

またはIリダイレクトを行うと、すべてのプライベートコンテンツを制限。

だからここに私の質問は以下のとおりです。

  1. が、これはそれを行うための安全な方法ですか?簡単にハッキングできますか?
  2. reverse lookupが可能な場合、md5はどのような意味を持っていますか?

ありがとうございます!

+3

[コードレビュー](http://codereview.stackexchange.com/)には最初の質問がおそらく適しています –

+2

[MD5パスワードハッシュ](http://security.stackexchange。あなたは本当にPHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使ってパスワードセキュリティを扱うべきです。ハッシュする前に[パスワードを逃さないでください](http://stackoverflow.com/q/36628418/1011527)、または他のクレンジングメカニズムを使用していることを確認してください。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

+1

[Little Bobby](http://bobby-tables.com/)は[あなたのスクリプトはSQLインジェクション攻撃の危険にさらされていると言います。](http://stackoverflow.com/questions/60174/how-can-i-prevent -sql-injection-in-php)[MySQLi](http://php.net/manual/en/mysqli.quickstart)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメントについて学んでください。 .prepared-statements.php)。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

答えて

2

あなたはあなたより先に多くの仕事をしなければなりません。ここから始めるのが良い場所です。ここにはGoogleからのアイデアを取り入れることができます。そこには多くの情報が必要です。サーバとの両方ここIs HTTPS as the form's action enough?

(現在は私の選択)Password Hashing Functions

最後には良いSOポストがある消毒フォームの検証および入力をよく読んでここを参照してくださいハッシュ方法については参照ページを送信する方法については

またWhat's the best method for sanitizing user input with PHP?

、コメントの一つは、これはあなたがあなたの旅を始めることができますPrepared Statements

希望に表情を指摘するように。

1

ユーザー名とパスワードの両方をPOSTしているため、セキュリティはありません。 HTTPSを使用している場合を除き、インターネット経由で平文で送信されます。 MD5エンコーディングも無用です。

より安全な方法は、タイムスタンプが期限切れの理想的な状態でPOSTする前にパスワードをエンコードすることです。そのため、x時間後に再利用することはできません。

はまた、あなたのSQL文が

あらゆる戦略的なデータベースにあなたのコードを使用しないでください...これは、SQLインジェクションにデータベースを公開し、任意の消毒せずにPOSTされた値を使用します。

関連する問題