4

セッション アクションを処理する独自の Session クラスがあります。セッションが必要なときにのみ開始されるメカニズムを作りたかったのです。セッション変数が設定されていない場合、システムはそれを作成しません。

それがコードです(簡略化):

class Session
{
  public function __construct()
  {
  }

  protected function startSession($onlyIfExists = false)
  {
    if (session_id() == '')
    {
      if ($onlyIfExists && !isset($_COOKIE[session_name()]))
        return;
      @session_start();
    }
  }

  public function setVar($id, $value)
  {
    $this->startSession();
    $_SESSION[$id] = $value;
  }

  public function getVar($id)
  {
      $this->startSession(true);  //starts session only if the session-id cookie exists (if the session was already started for this user)
      if (isset($_SESSION) && array_key_exists($id, $_SESSION))
        return $_SESSION[$id];
      else return NULL;
  }
}

そして、セッション変数を取得/設定するには、常にこのクラス オブジェクトを使用する必要があります。

$session = new Session();
$session->getVar('test');  //does not start session at the first time
$session->setVar('test', 1);  //starts session; after refreshing the page the above line does start session (cookie exists) and the value=1 is returned

それは良い解決策ですか?潜在的な欠点や脆弱性はありますか? それとも、毎回セッションを開始するのが標準ですか?

私のアプリケーションでは、承認後にのみセッション変数が作成されるため、99.999% のユーザーにセッションは必要ありません。

前もって感謝します。

4

1 に答える 1

3

脆弱性: ないと思います。非常に簡単なコードで、うまくいかないことはあまりありません。

欠点: より多くのコードを除いて、実際には何もありません。

利点: 許可されたユーザーが少数の非常に使用頻度の高いシステムでのみ。実際、セッションの開始は、データベース クエリやコンテンツのコンパイルなどに比べれば、それほど大したことではありません。通常、これを最適化する必要はありません。毎回、または関連するページだけでセッションを開始します (たとえば、認証が必要なバックエンド ページがいくつかある場合は、そこでセッションを開始します)。もちろん、毎秒数千のユーザーを処理する場合を除きます。session_start()私は約0.1msを取るために簡単に測定しました。

改善: 以下で zerkms が提案するように、Cookie が存在する場合、またはサイトがセッションに書き込みたい場合は、セッションを開始することが、これを管理し、無駄なセッションを生成しないための最も簡単で確実な方法です。

于 2013-09-15T00:25:11.617 に答える