PHPのセッションID保護

Webサイトのセキュリティは、セッション管理に基づいています。 ユーザーがセキュリティで保護されたサイトに接続すると、ユーザー名とパスワードの形式で資格情報を提供します。 Webサーバーには、どのユーザーが既にログインしているか、どのようにページ間を移動するかがわかりません。 セッションメカニズムにより、ユーザーは新しいアクションを実行したり、新しいページに移動したりするたびにパスワードを入力する必要がなくなります。



基本的に、セッション管理は、ログインしたユーザーが現在接続されていることを確認します。 しかし、残念なことに、セッションは認証を必要とせずにWebサーバーへのアクセスを許可できるため、ハッカーにとって明らかな標的になりました。



ユーザー認証後、WebサーバーはユーザーにセッションIDを提供します。 この識別子はブラウザに保存され、認証が必要になるたびに置き換えられます。 これにより、ログイン/パスワード入力プロセスの繰り返しが回避されます。 これはすべてバックグラウンドで行われ、ユーザーに不快感を与えません。 新しいページを見るたびにユーザー名とパスワードを入力したと想像してみてください!



この記事では、私が知っているPHPでセッションIDを保護するためのすべての方法を説明しようとします。



行きましょう。





クッキーの使用



デフォルトでは、IDを含むすべてのセッション情報はCookieで送信されます。 しかし、これは常に起こるとは限りません。 一部のユーザーは、ブラウザでCookieを無効にします。 この場合、ブラウザはURLでセッション識別子を渡します。



www.example.org/index.php?PHPSESSID=n2cnj59d7s3p30fjs0jfn28nf



ここでは、情報がHTTPヘッダーに隠されている場合、Cookieを介したセッションとは異なり、IDはクリアテキストで送信されます。 これを防ぐ最も簡単な方法は、アドレスバーを介したセッション識別子の転送を禁止することです。 これを行うには、Apacheサーバーの.htaccess構成ファイルに次のように記述します。



php_flag session.use_only_cookies on







暗号化を使用する



サイトでクレジットカード番号(Sonyからの挨拶)などの機密情報を処理する必要がある場合は、SSL3.0またはTSL1.0暗号化を使用する必要があります。 これを行うには、Cookieを設定するときに、secureパラメーターにtrueを指定します。



セッションパスワードを$ _SESSION変数に保存する場合(sqlを使用することをお勧めします)、平文で保存しないでください。



 if ($_SESSION['password'] == $userpass) { //  }
      
      







パスワードはセッション変数にプレーンテキストで保存されるため、上記のコードは安全ではありません。 代わりに次のようなmd5暗号化を使用します。



 if ($_SESSION['md5password'] == md5($userpass)) { //  }
      
      







ブラウザチェック



別のブラウザー(コンピューター)からセッションを使用する可能性を遮断するには、ユーザーエージェントHTTPヘッダーフィールドのチェックを入力する必要があります。



 session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { //  } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); }
      
      







セッション期間



セッションの存続期間とCookieの期間を制限します。 デフォルトのセッション有効期限は1440秒です。 この値は、php.iniおよび.htaccessを使用して変更できます。 .htaccessの例:



#

php_value session.gc_maxlifetime 3600

#

php_value session.cookie_lifetime 3600









IPバインディング



特定の状況(常にではない)では、IPアドレスにバインドする必要があります。 ほとんどの場合、ユーザー数が制限されており、静的IPを持っています。 チェックは、許可されたIPアドレスのリスト、



 include ("ip_list.php"); //$ip_white_list = array ( 'admin1' => '111.222.333.444', 'admin2' => '555.666.777.888'); if(!empty(array_search($_SERVER['REMOTE_ADDR'],$ip_white_list))) { header("Location: admin.php"); } else { echo 'ACCESS DENY!'; }
      
      







各リクエストのIPアドレスごと(静的IPのみ):



 if(isset($_SESSION['ip']) and $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) { header("Location: admin.php"); } else { session_unset(); $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; }
      
      







ハッキングを完全に回避することは不可能であることに注意してください。 このハッキングは、既知の方法でのみ複雑化できます。 しかし、そのような保護で人生を複雑にしないために、合法的なユーザーについても忘れてはなりません。



All Articles