セッションCookieを配置せずにPHPで永続セッションを開始できる方法はありますか?IPアドレスベースのソリューションなど、ページ間でセッションを維持する他の方法はありますか?
私が尋ねる理由は、ほとんどのユーザーがCookieをオンにしているにもかかわらず、ログインシステムが無効になっている人のために機能する方法があるかどうかを見たいからです(クッキーを無効にすることは個人的には不要な妄想だと思いますが)。
ユーザーにCookieを有効にするように依頼するのはあまり面倒ではないと思います。人々が完全にそれらをオフにするとき、私はそれを愚かに見つけます。
それ以外の場合は、session.use_only_cookies
を「0」にして、セッションIDをPHP内のURLに強制的に追加します。ただし、このアプローチにはいくつかの欠点があります。主に、Cookieヘッダーではなく、URL内に状態を保持することです。ユーザーが自分のページのURLをコピーして貼り付け、他のユーザーがそれをクリックした場合、ユーザーは両方とも同じセッションを使用します。
<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 0);
ini_set("session.use_trans_sid", 1);
ini_set("session.cache_limiter", "");
session_start();
セッションIDをすべてのURLに追加するために、session.use_trans_sid
のini-Valueをtrueに設定できます。 this をご覧ください。
セキュリティのため、セッションを作成したIPにセッションを制限する必要があります。ただし、これは完全に安全ではありません。同じプロキシ(たとえば、プロキシの背後)を持つユーザーは、まったく同じセッションを再利用できます。
URLでセッションIDを操作し、Cookieを無効にすることができます:
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
session_start();
// IP check
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){
session_regenerate_id();
session_destroy();
session_start();
}
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR'];
// session stuff
注:URLでセッションIDを使用することは非常に控えめです。ワイヤレスカードを持ち歩き、プロキシサーバーが同じIPアドレスを持っていると、IPアドレスが変わることがあります。 「古いURL」(古いセッションID)をクリックすると簡単に壊れます。
また、独自のセッション処理関数を作成することもできます(データベースと組み合わせて)。セッションIDを無視して、IPアドレスにバインドします。 ( http://php.net/manual/en/function.session-set-save-handler.php の例を参照)
参照:
データベースレコードまたは一時ファイルを作成して、$_SERVER
すべてのページ読み込みでのリクエストに対する変数。これはセキュリティ上のリスクですが、十分な変数があると(リストを参照してください ここ )、ハイジャックの可能性が許容レベルまで下がったと感じるかもしれません。アプリの安全性を知っているのはあなただけです。
データベースのIPごとにセッションIDを保存できます:
Session_id、ip、一意の一時キー(ログに記録されたユーザー用)、またはその他の条件の3つのフィールドを持つmysqlテーブルを作成します。次に、セッションCookieとuse_trans_sidをオフにします。
次に、この新しいテーブルに基づいてセッションの動作を管理するコードを作成します!
session_start()
の後、session_idをテーブルに保存し、後でテーブルから(IPおよびその他の条件により)受信し、呼び出します。
session_id($in_table_session_id);
詳細および完全なガイドについては、以下を参照してください: https://Gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe
これに対する正しい答えはNOです。 Cookie以外の変数の組み合わせを使用することは安全ではありません。
考えてみてください:ユーザーが最初にページを要求すると、サーバーは「HTTPはステートレスです。これを保持して、次回の呼び出し時に「あなた」であることがわかります」という一意の値とともにページを送信します。つまり、そのブラウザで(タブに関係なく)その時点で実行されている人は、一意のトークンを持っています。
正常にログインした場合にのみ、そのトークンをサーバー側のセッションに関連付けることができます。トークンは非常に長くランダムであるため、だれもすぐには推測できません。
複数のブラウザが同じIPアドレスを使用している可能性があります。複数の人がまったく同じユーザーエージェントを持つことができます。 Cookieは、動作する唯一のストレージシステムです。
実際にはもう1つの方法があります。それは、一意のトークンをサーバーに戻るすべての単一リンクに加え、すべてのAJAX呼び出し、?PHPSESSID=my-unique-token-189481958
-しかし、それはコーディングの苦痛です。
それを行うには、HTMLコードにセッションIDをコメントタグとして追加し、PHPコードを使用および構成して、HTMLコードに含まれるセッションIDを使用します。ユーザーIPで実行したり、URLにセッションIDを追加したりするのではなく、それを行う方がより適切だと思います。