ホームページ  >  記事  >  バックエンド開発  >  LaravelのSessionid処理メカニズムの詳細な紹介

LaravelのSessionid処理メカニズムの詳細な紹介

巴扎黑
巴扎黑オリジナル
2017-09-14 10:18:491568ブラウズ

この記事では、主に 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 の Cookie には、弊社がカスタマイズした名前が付けられています。

このセッション 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のSessionid処理メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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