Wku

どのようにPHPとMySQLでのセキュアなログインスクリプトを作成する

ニュースでハッキングの、より多くの物語では、開発者が自分のサイトを確保する最善の方法を探しています。 あなたのサイトは、メンバーシステムを持っている場合、それがハッキングされているとユーザーデータが危険にさらされる可能性の危険にさらされる可能性が。 それは可能な限り安全であるように、このガイドでは、あなたのユーザシステムおよびログインを作成する最良の方法が表示されます。
このガイドに従うと、ハッカーがアカウントおよび/または変更データを削除し、他のユーザーアカウントの制御を取得するために使用できる攻撃のすべての種類に対して、防ぐことができます。 以下は、このガイドでは、防御可能な攻撃のリストです。

中身

  • あなたが必要とする 1 物事
  • 2 ステップ
    • 2.1 サーバーの構成
    • 2.2 設定MySQLデータベース
    • 2.3 データベース接続の作成 ​​ページ
    • 2.4は、PHP の関数を作成する
    • 2.5 処理ページを作成する
    • 2.6は、JavaScript ファイルを作成します。
    • 2.7は、HTML ページを作成する
    • 2.8 保護ページ
  • 3つ のヒント
  • 4 さらに読む
  • 5 警告
  • 6 関連グーグル

これは、何が必要です

我々は我々のMySQLデータベースにアクセスするために、PHPのクラスのセットmysqli_ *を使用されるように、あなたは、PHPとMySQLの以下のバージョンが必要になります。

  • PHPのバージョン5以降
  • MySQLのバージョン4.1.3以降

サーバ上でPHPとMySQLのバージョンを確認するには関数を使用します。

ステップ

どのようにPHPとMySQLでのセキュアなログインスクリプトを作成する. サーバ上でPHPとMySQLをインストールします.
どのようにPHPとMySQLでのセキュアなログインスクリプトを作成する. サーバ上でPHPとMySQLをインストールします.

あなたのサーバーを設定します

  1. 1
    サーバ上でPHPとMySQLをインストールします
    ほとんどのWebホスティングサービスは、PHPとMySQLが既にインストールされていますが、あなたはちょうど彼らが動作するように、このガイドのためにPHPとMySQLの最新バージョンを持ってチェックする必要があります。 あなたがあなた自身のサーバーまたはコンピュータを使用している場合、PHPとMySQLをインストールする方法については、以下のガイドを参照してください。

MySQLのデータベースを構成

  1. 1
    mysqlデータベースを作成します
    ハウツー·データベース·イン·phpmyadminのの作成を参照してください。
    データベースのコードを作成します。
    
    

    注:一部のホスティングサービスでは、phpMyAdminを介してデータベースを作成することはできませんが、 cPanelのでそれを行う方法を学ぶ
  2. 2
    のみ、選択してUPDATEおよびINSERT権限を持つユーザを作成します
    • ユーザー: "sec_user"
    • パスワード: "eKcGZr59zAa2BEWU"

    ユーザーコードを作成します。
    
    

    注:それはあなた自身のサーバー上で実行されている場合は、上記のコードでパスワードを変更することをお勧めします。 (また、あなたのPHPコードを変更することを確認してください。)それはあなたができるだけ複雑になって作るので覚えやすいパスワードにする必要はありません覚えておいてください。 ここにランダムパスワードジェネレータが。
  3. 3
    "メンバー"という名前のMySQLテーブルを作成します
    "メンバー"テーブルを作成します。
    
    

    フィールドの "パスワード"と "塩"は常に128文字の長さになるように我々は、我々は、の長さを知っているフィールドに対してCHARデータ型を使用しています。 ここにCHARを使用すると、処理能力を節約できます。
  4. 4
    ログイン試行を格納するテーブルを作成します
    "login_attempts"テーブルを作成します。
    
    
  5. 5
    表"のメンバー"でのテストの行を作成します
    我々は、登録ページを作成しないように、ログイン·スクリプトをテストすることが重要であろう。 以下にこれらの詳細を使用してユーザーを作成するスクリプトは、次のとおりです。
    • ユーザー名:TEST_USER
    • メール:test@example.com
    • パスワード:6ZaxN2Vzm9NUJT2y

    テストユーザーを追加します。
    
    

データベース接続の作成]ページ

  1. 1
    データベース接続ページを作成します
    データベース接続(db_connect.php):
    
    

PHP関数を作成します。

これらの関数は、ログイン·スクリプトのすべての処理を行います。 "のfunctions.php"というページへのすべての機能を追加します。

  1. 1
    しっかりとPHPセッションを開始します
    それは重要なだけ入れていません "にsession_start();"あなたはあなたが本当にセキュリティが心配している場合は、PHPのセッションを使用するすべてのページの上部には、これはあなたがそれを行うべきかである。 私たちは、 "sec_session_start"という関数を作成しようとしている、これは安全な方法でPHPのセッションを開始します。 あなたは、PHPのセッション変数にアクセスしたい任意のページの上部に、この関数を呼び出す必要があります。 あなたは本当にセキュリティとクッキーのプライバシーが心配な場合は、この記事を見ている作成-セキュアセッション管理運用システム·イン·PHP-と-mysqlの
    セキュアセッションスタート機能:
     関数 sec_session_start(){
     $するsession_name = 'sec_session_id'; / /カスタムのセッション名を設定
     $セキュア = falseは 、/ /は、HTTPSを使用している場合は、trueに設定します。
     $ HttpOnlyの = true、/ /これはJavaScriptがセッションIDにアクセスできることを停止します。
     
     ini_set( 'session.use_only_cookies'、1); クッキーのみ ​​を使用するために、/ /強制的にセッション。
     $ cookieParams = session_get_cookie_params(); / /取得し、現在のクッキーparamsを。
     
     するsession_name($ するsession_name)/ /セット上記のセットにセッション名。
     session_start(); /スタート/ phpのセッション
     するsession_regenerate_id(TRUE)/ /再生成セッション、古いものを削除してください。
     }
    

    また、セッションハイジャックを防ぐ助け、すべてのページのリロードにセッションIDを再生成 "するsession_regenerate_id()"関数を使用します。
    注:あなたがログインアプリケーションでHTTPSを使用している場合はtrueに変数 "セキュア$"を設定。
  2. 2
    ログイン機能を作成します
    セキュアなログイン機能:
     機能のログイン($メールを、$パスワード $ mysqliのは ){/ /プリペアドステートメントを使用して、SQLインジェクションが可能でないことを意味します ($ stmtは = $ mysqliの 場合 - >  準備  "SELECT ID、ユーザ名、パスワード、メンバーWHEREメールFROM塩= LIMIT 1 ")){$ stmtは - > それからbind_param( 's'は  電子メール$)/ /バインド"?パラメータに$メール"$ stmtは - >( 実行 )/ /プリペアドクエリを実行する $ stmtはを -  > 時にstore_result(); $ stmtは - > bind_result($ USER_ID、$ USERNAME、DB_PASSWORD $、$ ); / /結果から変数を取得 $ stmtは - >( フェッチ )、$パスワード =ハッシュ 'SHA512'、$パスワード。$ ); / /ハッシュユニークな塩を使用してパスワード ($ stmtの 場合 - > NUM_ROWS == 1){/ /ユーザーがアカウントが多すぎるログイン試行からロックされている場合は 場合は、/ /我々は checkbrute( チェックが存在する場合  { 場合 ($ DB_PASSWORD == $パスワード  場合{/ /チェック 、($ USER_ID、$ mysqliの )== TRUE){/ /アカウントは、/ /アカウントが falseを 返す ロックされていると言ってユーザーにメールを送信してロックされている } 。データベースのパスワードは、提出されたユーザーは、/ /パスワードが正しいパスワードと一致 $ user_browser = $ _SERVER ['HTTP_USER_AGENT'];!/ /ユーザーのユーザーエージェント文字列を取得します $ USER_ID = するpreg_replace( "/ [^ 0。 )-9] + / "、" "、$ USER_ID; $ユーザ名 = するpreg_replace(" / [^ A-ZA-Z0-、 我々はこの値を $ _SESSION ['user_id'] = $ USER_IDを 印刷するかもしれません/ / XSS保護として 9_ \ - ] + / "、" "、$ ユーザー名 )、我々はこれを印刷するかもしれないとして、/ / XSS保護 成功したログイン trueを 返します 。}  {/ /パスワード/ /我々は  、データベース $  = 時間 () は、この試みを記録して正しくありません 。$ mysqliの - > クエリ  "login_attempts。INSERT INTO(USER_ID、時刻)VALUES( '$。 USER_ID '、' $今 ') ");  戻り値 ;}}}  {/ /いいえ、ユーザが存在しない falseを 返す ;}}} 
  3. 3
    ブルートフォース機能
    login_check機能を作成します。
     関数 checkbrute($ USER_ID、$ mysqliの ){
     / /現在の時刻のタイムスタンプを取得する
     今$ = 時間 ();
     / /すべてのログイン試行は、過去2時間からカウントされます。
     $ valid_attempts = $今 - (2 * 60 * 60); 
     
     { - (>、( "USER_ID = AND時間> '$ valid_attempts' login_attempts FROM SELECT時間?") 準備 $ stmtは = $ mysqliの  場合 
     $ stmtは - > それからbind_param( 'I'、$ USER_ID); 
     / /プリペアドクエリを実行します。
     $ stmtは - > execute() ;
     $ stmtは - > 時にstore_result();
     / / 5つ以上のログイン失敗があった場合
     { - (> NUM_ROWS> 5 $ stmtは  場合
     trueを 返します 
     }  {
     falseを 返します ;
     }
     }
     }
    

    ブルートフォース攻撃は、CAPTCHAテストを使用してユーザーアカウントをロックし、失敗したログインの上の遅延を追加している我々はそれらを防ぐことができますいくつかの方法を防ぐために困難であるため、ユーザーは、別の30秒間ログインできません。
    この問題に直面したとき、ほとんどの開発者は、単に失敗したログインの一定量の後にIPアドレスをブロックします。 プロセスを自動化するための多くのツールを使用すると、これらのツールは、プロキシのシリーズを通過しても、それぞれの要求に応じてIPアドレスを変更することができます。 すべてのこれらのIPアドレスをブロックすると、あなたが同様に正当なユーザーをブロックしている意味するかもしれません。
  4. 4
    状態でログインを確認してください
    私たちは、 "USER_ID"と "login_string"セッション変数をチェックすることによってこれを行う。 "login_string"セッション変数には、パスワードと一緒にハッシュ化ユーザブラウザの情報を持っています。 それは、ユーザーがブラウザ半ばセッションを変更されることはほとんどありませんので、我々は、ブラウザ情報を使用しています。 これを行うと、防ぐことができ、セッションがハイジャック
    login_check機能を作成します。
     関数 login_check($ mysqliの ){
     すべてのセッション変数が設定されている場合は、/ /チェック
     場合  かどうかの判断 ($ _SESSION ['user_id']、$ _SESSION ['ユーザ名']、$ _SESSION ['login_string'])){
     $ USER_ID = $ _SESSION ['user_id'];
     $ login_string = $ _SESSION ['login_string'];
     $ユーザ名 = $ _SESSION ['ユーザ名'];
     
     $ user_browser = $ _SERVER ['HTTP_USER_AGENT']; / /ユーザーのユーザーエージェント文字列を取得します。
     
     するif($ stmtは = $ mysqliの - >は、( "?イド= LIMIT 1メンバーからSELECTパスワード") を準備 ){ 
     $ stmtは - > それからbind_param( 'I'、$ USER_ID)/ /バインドパラメータに"$ USER_ID"。
     $ stmtは - > execute() / /プリペアドクエリを実行します。
     $ stmtは - > 時にstore_result();
     
     するif($ stmtは - > NUM_ROWS == 1){/ /ユーザーが存在する場合
     $ stmtは - > bind_result($パスワード )/ /結果から変数を取得します。
     $ stmtは - > fetch()  ;
     $ login_check =ハッシュ 'SHA512'、$パスワード$ user_browser。);
     {($ login_check == $ login_string) 場合
     / /ログイン中!!
     trueを 返します 
     }  {
     / /ログインしていません
     falseを 返します ;
     }
     }  {
     / /ログインしていません
     falseを 返します ;
     }
     }  {
     / /ログインしていません
     falseを 返します ;
     }
     }  {
     / /ログインしていません
     falseを 返します ;
     }
     }
    

処理ページを作成

  1. 1
    ログイン処理のページを(process_login。PHP)を作成します。
    前の例に従うなら、これはprocess_login.php名前を付ける必要があります。
    ログイン処理ページ(process_login.php)
     'db_connect.php'を 含んでいる ; sec_session_start();; 'のfunctions.php' が含まれます 。/ / phpのセッションを開始する当社独自の安全な方法 であれば  かどうかの判断 ($ _POST ['メール']、$ _POST ['P']) ){$ メール = $ _POST ['メール']、$ パスワード = $ _POST ['P'];。/ /ハッシュ化されたパスワード であれば ログイン($メール、$パスワード $ mysqliの )== TRUE){/ /ログイン成功 echo ' この 成功は:あなたがログインされました!';}  {/ /ログイン失敗した ヘッダ  '場所:。?/考えられる理由エラー= 1');}}  {/ /正しいPOST変数はありませんでしたこのページに送られ ますecho '無効な要求が';} 

  2. 2
    ログアウトスクリプトを作成します
    :スクリプト(logout.php)ログアウト
    
    

    注意:これは、誰かが何とか隠​​れこのページのリンクを送っているかのようにここにCSRFの保護を追加するのは良い考えかもしれません。 ユーザがログアウトされます。
  3. 3
    登録ページ
    ハッシュスクリプト:
     / /フォームからハッシュ化されたパスワード
     $パスワード = $ _POST ['P']; 
     / /ランダムなsaltを作成
     $ random_salt =ハッシュ'SHA512'、uniqid(mt_rand(1、mt_getrandmax())、  ​​));
     / /(ではない上に、シーズンに慎重)塩漬けパスワードを作成
     $パスワード =ハッシュ 'SHA512'、$パスワード$ random_salt。);
     
     / /ここでデータベーススクリプトへの挿入を追加します。
     / /あなたはプリペアドステートメントを使用してください!
     するif($ insert_stmt = $ mysqliの - > 準備  "メンバー。INSERT INTO(ユーザ名、メールアドレス、パスワード、salt)VALUES(、、、)??")){ 
     insert_stmt $ - > それからbind_param( 'SSSS'、$ユーザ名  メールアドレス$、$パスワード $ random_salt); 
     / /プリペアドクエリを実行します。
     insert_stmt $ - > 実行 ();
     }
    

    パスワードのサーバー側を検証するため、この方法を使用していない場合は、['P']が既に、JavaScriptからハッシュさ$ _POSTの値が、それはハッシュ確認していることを確認します。

JavaScriptファイルを作成します。

  1. 1
    SHA512。jsファイルを作成します。
    ファイルがpajhome.org.ukからダウンロードすることができます
  2. 2
    フォームを作成します。jsファイル
    Javascriptのフォームファイル(forms.js):
     機能 formhash(フォームパスワード){ 
      / /新しい要素の入力を作成し、これはハッシュ化されたパスワードフィールド外となります。 
      VAR P =ドキュメントcreateElement( "入力"); 
      / /私たちのフォームに新しい要素を追加します。 
      フォームappendChild(P); 
      。P  = "P"; 
      タイプ = "隠された" 
      のp  = hex_sha512(password.  ); 
      / /平文パスワードが送信されないことを確認してください。 
      パスワード = ""; 
      / /最後に、フォームを送信します。 
      フォーム提出 (); 
     } 
     

HTMLページを作成します。

  1. 1
    ログインフォーム(ログイン。PHP)を作成します。
    これは、 "電子メール"と"パスワード"という名前の2つのテキストフィールドを持つHTMLフォームです。 Javascriptのは、パスワードのハッシュを生成し、サーバに"電子メール"と"P"(ハッシュ化されたパスワード)をお送りします。
    にログインするとき、それは我々がログインIDとして電子メールを使用しているこのガイドのために公開されていません何かを使用するのが最善ですが、ユーザ名は、ユーザを識別するために使用することができます。 メールが表示されていない場合、それはハッキングアカウントの別の変数を追加します。
    HTMLログインフォーム:
     < スクリプトタイプ = "テキスト/ javascriptの" SRC = "sha512.js"> </ SCRIPT> 
     < スクリプトタイプ = "テキスト/ javascriptの" SRC = "forms.js"> </ SCRIPT> 
     <?PHP 
     場合かどうかの判断($ _GET ['エラー'])){ 
     エコー'のログインエラー!'; 
     } 
     ?> 
     < フォーム アクション = "process_login.php" メソッド = "ポスト" 名前 = "login_form"> 
      メール:< 入力 タイプ = "テキスト" 名前 = "メール" /> <BR /> 
      パスワード:< 入力 タイプ = "パスワード" 名前 = "パスワード" ID = "パスワード" /> <BR /> 
      < 入力 タイプ = "ボタン" の値 = "ログイン" のonclick = "formhash(this.formを、this.form.password);" /> 
     </ フォーム > 
     

    注:それは平文で送信されないように、我々は、パスワードを暗号化しているにもかかわらず、それはパスワードを送信するときにhttpsプロトコル(SSL / TLS)を使用することをお勧めします。 (参照: ネットワーク盗聴を )。

ページの保護

  1. 1
    ページ保護スクリプト
    保護ページ:
     / /ここでは、データベース接続と機能を含めます。
     sec_session_start();
     {(login_check($ mysqliの )== true)  場合
     
     / /ここに保護されたページのコンテンツを追加!
     
     }  {
     あなたはこのページにアクセスする権限がありません' エコー 、ログインしてください。 'があったら ;
     }
    

    ユーザーがログインしている場合かどうかをチェックするために、この関数を使用していることを確認し

ヒント

  • 非常にいくつかの変更でこれらのサンプルスクリプトは、次のような、または他のSQLシステムで動作するように修正することができます。
  • ログインスクリプトにMD5()関数から近づか、MD5ハッシュアルゴリズムは、現在考えられている。
  • お好みに合わせてログインフォームと出力ページをフォーマットするためにHTMLとCSSを使用してください。

参考文献

警告

  • 何も100%安全ではありません。 スクリプトのセキュリティを維持向上するために、最新のセキュリティニュースをチューンに滞在することを忘れないでください。
  • ユーザーが誤ったサーバーのセットアップのために発生せかもしれない、あなたのPHPスクリプトを見ることができないことを確認してください。 PHPコードが表示されている場合は、データベース名とパスワードに関する情報を収集するユーザーの可能​​性があります。