PHPで責任あるセッションセキュリティを維持するためのガイドラインは何ですか?Web全体に情報があり、すべてが1か所にまとまった時期です。
PHPで責任あるセッションセキュリティを維持するためのガイドラインは何ですか?Web全体に情報があり、すべてが1か所にまとまった時期です。
回答:
セッションを安全に保つには、いくつかのことを行う必要があります。
$_SERVER['HTTP_USER_AGENT']
。これは、セッションのハイジャックに小さな障壁を追加します。IPアドレスを確認することもできます。しかし、これは、複数のインターネット接続での負荷分散などのためにIPアドレスを変更しているユーザーに問題を引き起こします(ここでの環境の場合)。1つのガイドラインは、セッションのセキュリティレベルが変更されるたびにsession_regenerate_idを呼び出すことです。これにより、セッションのハイジャックを防ぐことができます。
私の2つ(またはそれ以上)のセント:
このトピックについては、小さいながらも優れた本があります。ChrisShiflettによるEssential PHP Securityです。
必須のPHPセキュリティhttp://shiflett.org/images/essential-php-security-small.png
本のホームページには、興味深いコード例とサンプルの章があります。
:あなたはここで説明する、(IP&ユーザーエージェント)上記の技術を使用することができます個人情報の盗難を避けるためにどのように
(PHP 6で対処されている)主要な問題の1つはregister_globalsだと思います。現在、回避するために使用される標準的な方法の1つは、または配列register_globals
を使用することです。$_REQUEST
$_GET
$_POST
これを行う「正しい」方法(5.2の時点では少しバグがありますが、6の時点では安定しています)はフィルターを使用する方法です。
だから代わりに:
$username = $_POST["username"];
あなたがするでしょう:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
または単に:
$username = filter_input(INPUT_POST, 'username');
このセッション固定ペーパーには、攻撃が発生する可能性のある非常に良い指針があります。ウィキペディアのセッション固定ページも参照してください。
これはかなり簡単で明白ですが、使用するたびに必ずsession_destroyを実行してください。ユーザーが明示的にログアウトしないと、これを実装するのが難しい場合があるため、タイマーを設定してこれを実行できます。
これはsetTimer()とclearTimer()の良いチュートリアルです。
PHPセッションとセキュリティ(セッションハイジャック以外)の主な問題は、現在の環境にあります。デフォルトでは、PHPはセッションデータをOSの一時ディレクトリのファイルに保存します。特別な考えや計画がなければ、これは世界中で読み取り可能なディレクトリであるため、すべてのセッション情報はサーバーにアクセスできるすべての人に公開されます。
複数のサーバー上でセッションを維持することに関して。その時点で、提供された関数を呼び出してセッションデータをCRUD(作成、読み取り、更新、削除)するユーザー処理セッションにPHPを切り替えることをお勧めします。その時点で、データベースまたはmemcacheのようなソリューションにセッション情報を保存して、すべてのアプリケーションサーバーがデータにアクセスできるようにすることができます。
共有サーバーを使用している場合は、独自のセッションを保存すると、データベースに保存できるため、ファイルシステムを頻繁に制御できるので便利です。
私はこのようにセッションをセットアップしました
ログインページ:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(設定ページで定義されたフレーズ)
次に、サイトの残りの部分全体にあるヘッダーに:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
はまったく役に立ちません。実際、保護アルゴリズム自体が実際に悪用される可能性があり、以前よりも悪化しています。
IPとユーザーエージェントの両方をチェックして、それらが変更されるかどうかを確認します
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
session_set_save_handler()を使用すると、独自のセッションハンドラーを設定できます。たとえば、データベースにセッションを保存できます。データベースセッションハンドラの例については、php.netのコメントを参照してください。
複数のサーバーがある場合はDBセッションも有効です。それ以外の場合、ファイルベースのセッションを使用している場合は、各Webサーバーが同じファイルシステムにアクセスしてセッションを読み書きできることを確認する必要があります。
セッションデータが安全であることを確認する必要があります。php.iniを確認するか、phpinfo()を使用して、セッション設定を確認できます。_session.save_path_は、それらが保存されている場所を示します。
フォルダとその親の権限を確認してください。パブリック(/ tmp)にしたり、共有サーバー上の他のWebサイトからアクセスしたりしないでください。
phpセッションを引き続き使用する場合は、_session.save_path_を変更して他のフォルダーを使用するようにphpを設定するか、_session.save_handler_を変更してデータベースにデータを保存できます。
php.ini(一部のプロバイダーでは許可されています)またはapache + mod_phpの場合、サイトのルートフォルダーにある.htaccessファイルに_session.save_path_を設定できる場合があります
php_value session.save_path "/home/example.com/html/session"
。実行時に_session_save_path()_を使用して設定することもできます。
Chris ShiflettのチュートリアルまたはZend_Session_SaveHandler_DbTableをチェックして、代替のセッションハンドラーを設定してください。