web-dev-qa-db-ja.com

データベースにセッションを保存するとよいのはなぜですか?

Codeigniterには、セッション値をデータベースに保存する機能があることがわかりました。
データベースにセッションを保存することは、セキュリティ対策として優れていると言われています。

ただし、セッション情報をデータベースに保存するとパフォーマンスが向上すると思います。
次のようなセッションのいくつかの要素のみを保存します。

CREATE TABLE IF NOT EXISTS  'ci_sessions' (
  session_id varchar(40) DEFAULT '0' NOT NULL,
  ip_address varchar(16) DEFAULT '0' NOT NULL,
  user_agent varchar(50) NOT NULL,
  last_activity int(10) unsigned DEFAULT 0 NOT NULL,
  user_data text NOT NULL,
  PRIMARY KEY (session_id)
);

しかし、サイトがユーザー名、最終ログイン時間などのセッション変数をさらに使用する場合、それらをデータベースに保存してプログラムで使用できます。

これらの列を同じテーブルに追加する必要がありますか?セッション情報をデータベースに保存することは、Webサーバーのメモリ使用量(RAM)を削減するのに役立つと思う誰がどのような意味でセキュリティを改善できるのか説明できますか。

44
kiriappa

セキュリティは改善されません。

データベースにセッションを保存するための最も一般的で合理的なパターンは、複数のフロントエンドサーバーがある場合であるため、それらの共有セッションストレージが必要です。

Downvotersの場合:ファイルシステム内のファイルは、データベース内のレコードほど安全ではありません。

88
zerkms

セッションをハイジャックできないという考えです。

セッションIDはCookieに保存されます。ハッカーがそのIDを盗むことができる場合、セッションはIDによって識別されるため、他の誰かになりすますことができます。

ユーザーのセッションID、IP、およびエージェントサーバー側(データベースなど)を保存することにより、データベースに保存されたデータをクライアントと比較できます。ハッカーが誰かのセッションIDを盗む場合、ハッカーは一致するIPやユーザーエージェントを持たない可能性があり、ユーザーを一致させないため、特定のコンテンツを表示または非表示にできます。

ただし、データを手動で比較する必要があります。

17
Tim S.

ファイルベースのセッションでの一般的なセキュリティの偽造パスは、/tmpまたは第三者がデータにアクセスできる別の共有ディレクトリ。特に共有ホストでは、これが問題になる可能性があります。しかし、これは適切なファイル許可で防ぐことができます。

それらをデータベースに保存するということは、データベースのすべてのアクセス制限が設定されていることを意味しますが、データベースを正しく構成し、データベースの物理ストレージを安全にセットアップする必要もあります。

ファイルベースのセッションでは常にディスクアクセスが発生するのに対し、データベースサーバーにキャッシュとメモリ内のストレージを介してパフォーマンスを向上させるレイヤーがあれば、パフォーマンスが向上します。ファイルのロック以外の同時実行メカニズムを選択できるため、同時アクセスを改善できます。ただし、データベースサーバーが既に通常のデータベース処理でビジー状態になっている場合は、さらにセッション処理をスローすることをお勧めします。

9
deceze

これは答えることです:それらをデータベースに保存し、プログラムで利用できますか?

はい、データベースに保存できますが、そのために別の列を作成する必要はありません。それはuserdata列に入ります。

$this->session->set_userdata('sessionname',session value);でユーザー名を設定できます

$var=$this->session->userdata('sessionname');で取得できます

4
Ganesh RJ

PHPまたはMYSQLを使用するかどうかについては言及しませんが、データベースにセッションを保存してもパフォーマンスは向上しません。実際はまったく逆です。

PHPのデフォルトのファイルベースのセッションは、データベースからセッション値を取得するよりもはるかに高速ですが、毎秒数千のクエリを処理するまで違いに気付かないでしょう。

3
Vincent
  • アプリケーションは、サーバーアフィニティなしで複数のサーバーで実行できる必要があります(同じクライアントからの要求を同じサーバーに送信する方法)。セッションが適切に機能し続けることを確認する簡単な方法は、すべてのサーバーに共通の中央データベースにセッションを保存することです。

  • アプリケーションは、共有ホスト上で実行できる必要があります。共有ホストでは、ファイルシステムへのセッションデータの保存に関連する重大なセキュリティ上の懸念があります。

  • アプリケーションのパフォーマンスニーズは非常に厳しいものであり、セッションデータ用のより洗練されたストレージソリューションが必要です。データベースのパフォーマンスの問題に対処する多くの既存のアイデアと方法論があり、これらはセッションがデータベースに保存されるときに使用できます。

2
Nikunj K.