2017-04-05 16 views
0

これは、それが全体のウェブサイト全体にロードされているように私のinit.phpが見えるものです:PHPセッションを効率的に処理するには?

$suid = 0; 
session_set_cookie_params(60, '/', '.' . $_SERVER['HTTP_HOST'], true); 
session_save_path(getcwd() . '/a/'); 
if (!isset($_SESSION['id'])) { 
    session_start(['cookie_lifetime' => 60]); 
    $_SESSION['id'] = session_id(); 
    $_SESSION['start'] = date('d_m_Y_H_i'); 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} elseif (isset($_SESSION['uid'])) { 
    $suid = $_SESSION['uid']; 
} 

私は現在、PHPのセッションをテストしていますので、私はちょうど寿命として60秒置きます。

誰もまだドメインを知っていないのでセッションが作成されたのはなぜかと思っていたので、ipを追加しました。私はそれを見て、これを見つけた:

enter image description here

だから、Googleのクローラボットでした。より多くの検索エンジンとボットがあるので、私はこれらのクロールをセッションファイルに保存し、ウェブスペースにそれを埋めることはしません。

だから私の質問は以下のとおりです。

1)テスト生涯価値(60秒)を超える場合でも、セッションファイルは、カスタムディレクトリに残っています。私はこれを読んだのは、私がカスタムディレクトリを設定したからです。これは本当ですか?

2)未使用/期限切れのセッションファイルをすべて削除する効率的な方法はありますか?私は$_SESSION['last_activity']にタイムスタンプをつけて、自分のカスタムディレクトリにcronjobを見せて、セッションファイルのデータを取得し、それを削除する期限切れのセッションを計算する必要がありますか?

3)$_SERVER['HTTP_HOST']内の文字列 "bot"を探しているボットクローラで不要なセッションを保存しないでください。そうでないと "非人間的な訪問者" /クローラを識別する良い方法がありますか?

トップに私のコードに改善や提案をいただきありがとうございます。私はちょうどsession_start()が私がphp-fpm-slow -logsから告げることができるところまで頻繁に呼び出されたので、以前はInternal Server Errorの一部を発生させました。

答えて

1

1)テスト生涯価値(60秒)以上である場合でも、セッションファイルは、カスタムディレクトリに残ります。私はこれを読んだのは、私がカスタムディレクトリを設定したからです。これは本当ですか?

いいえ、カスタムディレクトリはセッションGCによって選択され、ファイルはクリーンアップされます。すぐには起こりません。

2)未使用/期限切れのセッションファイルをすべて削除する効率的な方法はありますか?私は$_SESSION['last_activity']にタイムスタンプをつけて、自分のカスタムディレクトリにcronjobを見せて、セッションファイルのデータを取得し、それを削除する期限切れのセッションを計算する必要がありますか?

PHP 7.1にはsession_gc()があります。これはクローンジョブから呼び出すことができ、必要な処理をすべて行います。

古いバージョンのPHPでは、デフォルトでクリーンアップがランダムに実行されるprobability-based GCに依存しています。サーバーDebianを実行している場合...しかし


これは特に効率的ではないかもしれないが、それは10年以上にわたってのみユニバーサルソリューションとなっているので、それはおそらくsession.gc_probabilityセットにしています0と定期的にクリーンアップを行うにはDebian固有のcrontabスクリプトを使用して - あなたは、その場合のカスタムディレクトリに問題があるだろう、といくつかのオプションがあります:

  • が再度有効session.gc_probability手動
  • session.save_pathをphp.iniに直接設定すると、デフォルトのcronスクリプトがそれを受け取ることができます。
  • カスタムディレクトリを使用しないでください。現在あなたがgetcwd().'/a/'を持っていることを考えると、私はDebianのデフォルトセッションディレクトリはほぼ確実により安全な場所だと言いたいので、客観的にはより良いものになるでしょう。
  • これを行うにはあなた自身のcronjobを書いてください。しかし、あなたは何をしているのか本当に知る必要があります。 $_SESSION['last_activity']はこれでも使用できません。ファイルシステム自体によって提供されるファイルアクセス/変更時刻は、

3)私はちょうど$_SERVER['HTTP_HOST']内の文字列「ボット」をお探しの方ボットクローラにより、これらの不要なセッションを保存回避または/クローラを「非人間の訪問者」を識別するための良い方法はありますでしょうか?

あなたは$_SERVER['HTTP_USER_AGENT']と考えていますが、これは解決策ではありません。

ほとんど知られていない(またはほとんど無視されますが)これを正しく行うには、ログインの前にセッションを起動しないでください。

無駄なセッションファイルをトリガーするクローラーの煩わしさは無視できない問題です。実際の懸念事項は、セッションストレージをいっぱいにし、可能なすべてのセッションIDを使い切って、攻撃を防ぎ、session.use_strict_modeを避けることができる攻撃者の能力です。これらの攻撃はDoSやセッションの固定につながりません。可能性として容易に却下される。

P.S.ボーナスのヒント:ヘッダーのユーザー入力である$_SERVER['HTTP_HOST']を使用しないでください。この場合、クッキーの仕組みによって安全かもしれませんが、一般的には避けるべきです。

+0

うわー。その詳細な答えをありがとう!私はそれがすぐには起こらないことを知らなかった。私はまだ自分のカスタムディレクトリを追跡していませんでしたが、削除されていないようです。ですから、 'filemtime()'を使って最後に修正されたファイルの時刻を検出することをお勧めしますか?ログインしていないユーザーとカスタムディレクトリを使用してセッションを設定する方法:同じサーバー上の2つの異なるドメインからajaxリクエストを送信し、セッション変数を使用してセッション変数に保存した言語コードを取得します。登録フォームの中にも(3ステップ)。ログインしたユーザーなしでセッションを使用しないようにするには、それを通常のCookieに置き換える必要がありますか? – AlexioVay

+0

この2番目のコメントを残して申し訳ありません、それを明確にしたかっただけです。ajaxとカスタムディレクトリの問題は、そのドメインを参照する正しいセッションを検出することです。私はこのために別の方法を見つけることができませんでした。 – AlexioVay

+0

はい、シンプルなクッキーは、単純な言語識別子ではうまくありません。セッションはプライベートデータと認証のためのもので、表示言語を選択する必要はありません。 :) – Narf

1
  1. cleanup php session files

  2. このcronジョブは、すでに(1を参照)が存在する - 最も効率的な方法があるため、メモリ使用量とTTLのmemcachedの代わりにプレーンファイルでセッションデータを格納することです。

  3. 文字列をユーザーエージェントやホストと比較するのは信頼できないため、HTTP_HOSTはローカルホスト名であり、リモートホスト名ではありません。なぜなら、あなたはあなたのGoogleのランキングにとって非常に悪いウェブサイトの動作を偽造します。ウェブサイトの他の訪問者のようにGoogleにようこそ。

+0

ご協力いただきありがとうございます。残念ながら私は共有ホスト上にあり、memcacheを有効にすることはできません。サーバー設定にアクセスできない別の方法がありますか? – AlexioVay

+0

@Vayいいえ、本当はありません。しかし一方で、ファイルはそこにあることが大丈夫です。彼らは問題ではありません。それらを直ちに削除する必要がある場合は、ディスクに一定のI/Oが残っています。 – DanFromGermany

関連する問題