ホームページ  >  記事  >  バックエンド開発  >  LaravelのSessionid処理の仕組みを詳しく解説

LaravelのSessionid処理の仕組みを詳しく解説

*文
*文オリジナル
2018-01-03 17:02:572899ブラウズ

この記事では、Laravel の Sessionid 処理メカニズムに関する関連情報を、サンプル コードを通じて詳しく紹介します。必要な方は、このエディターを参照してください。勉強して勉強してください。お役に立てれば幸いです。

はじめに

この記事では主にLaravelのSessionid処理機構に関する関連内容を紹介し、参考と学習のために共有します。以下では多くを述べませんが、詳細を見てみましょう。導入。

セッションCookie名は、Laravelの設定ファイルconfig/session.phpで設定できます。たとえば、このプロジェクトでは、名前は「sns_session」に設定されています:

/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
 
'cookie' => 'sns_session',

ページを更新してCookieを確認すると、それがわかります。 、 sns_session という名前が見つかります。この名前は私たちがカスタマイズしたものです。

このセッション ID は、Cookie とセッションの間のブリッジです。サーバーはこのセッション ID を使用して、リクエストの送信元を決定します。

LaravelのセッションIDは更新されるたびに変わります

ただし、ページが更新されるたびにこのCookieの値も変わります!では、サーバーはどのようにしてセッションを維持するのでしょうか?セッションIDは常に変化するためです。

LaravelはCookieを暗号化します

vendor/laravel/framework/src/Illuminate/Session/Store.phpのsaveメソッドでデバッグし、ここでコールスタックを出力します:

/**
 * {@inheritdoc}
 */
public function save()
{
 $this->addBagDataToSession();
 
 $this->ageFlashData();
 
 $this->handler->write($this->getId(), $this->prepareForStorage(serialize($this->attributes)));
 
 $this->started = false;
 
 dd(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT,5));
}

ページが更新されても、Store オブジェクトの id 属性は実際には変更されません。この属性は sessionid cookie の値です。つまり、sessionid の値は毎回変更されませんが、Cookie が書き込まれるときに値が変更されます。

その理由は、vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php の encrypt メソッドで見つかりました。このミドルウェアはすべての Cookie 値を暗号化し、Web ミドルウェアに含まれています。

protected function encrypt(Response $response)
{
 foreach ($response->headers->getCookies() as $cookie) {
 if ($this->isDisabled($cookie->getName())) {
  continue;
 }
 
 $response->headers->setCookie($this->duplicate(
  $cookie, $this->encrypter->encrypt($cookie->getValue())
 ));
 }
 return $response;
}

そして、この暗号化方式は毎回暗号化結果が異なるため、sessionidの値が毎回変わっているように見えますが、実際には変わっていません。この Cookie は、必要なときに復号化されます。

Laravel フレームワークは、セッションハイジャックを防ぐためにこのように設計されている可能性があります。考察がかなり充実してますね!

その他の補足知識

ネイティブPHP設定セッション名

session_name()関数:

<?php
 
/* 设置会话名称为 WebsiteID */
 
$previous_name = session_name("WebsiteID");
 
echo "The previous session name was $previous_name<br />";
?>

session_name() この関数は現在のセッション名を返します。 name パラメーターが指定されている場合、 session_name() 関数はセッション名を更新し、元のセッション名を返します。 session_name() 函数返回当前会话名称。 如果指定 name 参数, session_name() 函数会更新会话名称, 并返回 原来的 会话名称。

请求开始的时候,会话名称会被重置并且存储到 session.name 配置项。 因此,要想设置会话名称,那么对于每个请求,都需要在 调用 session_start() 或者 session_register() 函数 之前调用 session_name()

リクエストが開始されると、セッション名がリセットされ、session.name 構成アイテムに保存されます。 したがって、セッション名を設定するには、リクエストごとに session_start() または session_register() 関数を呼び出す前に、 session_name() を呼び出す必要があります。 .コード>関数。

COOKIEとSESSIONの違いと関係

  • COOKIEはクライアント側に保存され、SESSIONはサーバー側に保存されます
  • セキュリティの面ではSESSIONの方が安全です
  • 保存されるコンテンツの種類の観点から見ると、COOKIE は文字列のみを保存します (文字列に自動的に変換できます)
  • 保存されるコンテンツのサイズの観点から見ると、COOKIE によって保存されるコンテンツは限られており、比較的小さいですが、 SESSIONは基本的に
  • にはそのような制限はありません
  • パフォーマンスの観点から、SESSIONを使用するとサーバーへの負荷が高くなります

SEEIONはCOOKIEに依存しますが、COOKIEが無効になっている場合は、 url

関連する推奨事項:

laravelで暗号化サービスをカスタマイズする方法を説明する

Laravel最適化分割ルーティングファイル

🎜🎜lar avel の APP インターフェイス (API) の作成🎜🎜🎜

以上がLaravelのSessionid処理の仕組みを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。