PHP を介してドメイン、サブドメイン、またはサーバー間でセッション ログインを読み取るにはどうすればよいですか?この記事では詳しい紹介をしていますので、困っている方は参考にしてください。
PHP クロスサブドメインおよびクロスサーバー
セッションは主に 2 つの部分に分かれています:
1 つはセッション データで、デフォルトでサーバーの tmp ファイルに保存され、ファイルの形式で存在します。
もう 1 つは、セッション データをマークするセッション ID です。セッション ID は、セッション ファイルのファイル名であり、ランダムに生成されるため、一意性とランダム性が保証され、セッションのセキュリティが確保されます。通常、セッションのライフサイクルが設定されていない場合、セッション ID はブラウザを閉じた後、自動的にログアウトされ、新しいセッション ID が登録されます。クライアントが Cookie を無効にしない場合、Cookie はセッション セッションの開始時にセッション ID とセッションの有効期間を保存する役割を果たします。
2 つの異なるドメイン名の Web サイトが同じセッションを使用したいと考えていますが、これにはセッションのクロスドメインの問題が伴います。
デフォルトでは、各サーバーは同じクライアントに対してそれぞれ SESSIONID を生成します。たとえば、同じユーザー ブラウザの場合、サーバー A によって生成される SESSION ID は 11111111111 ですが、サーバー B によって生成される SESSION ID は jbxuejbxue です。また、PHP の SESSION データは、このサーバーのファイル システムに別途保存されます。 SESSION データを共有したい場合は、次の 2 つの目標を達成する必要があります:
1 つは、同じクライアントに対して各サーバーによって生成される SESSION ID が同じである必要があり、同じ COOKIE を通過できることです。つまり、各サーバーは PHPSESSID という名前の同じ COOKIE を読み取ることができなければなりません。もう 1 つは SESSION です。データの保存方法と場所は、各サーバーがアクセスできることを保証する必要があります。簡単に言うと、これら 2 つの目標は、複数のサーバー (A サーバーと B サーバー) がクライアントの SESSION ID を共有し、サーバーの SESSION データも共有する必要があるということです。
最初の目標の実現は、実際には非常に簡単です。COOKIE のドメイン (setcookie() 関数の 4 番目のパラメーター) を特別に設定するだけです。デフォルトでは、COOKIE のドメインは現在のドメイン名です。サーバーのIPアドレスが異なる場合、各サーバーが設定したCOOKIESは相互にアクセスできません。
1) クロスサブドメイン
この方法では、クロスドメインは機能できませんが、同じサブドメインは機能します。たとえば、aaa.jbxue.com と www.jbxue.com は両方ともドメイン .jbxue.com に属します。その後、COOKIE のドメインを に設定できます。 jbxue..com、つまり aaa.jbxue.com、www.jbxue.com などはこの COOKIE にアクセスできます。このようにして、各サーバーが同じクライアント SESSION ID を共有するという目的が達成されます。
1. PHP ページの最初 (出力の前、session_start() の前) で次の設定を行うだけです。
ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', '.mydomain.com'); ini_set('session.cookie_lifetime', '1800');
2.php.iniで設定します
session.cookie_path = / session.cookie_domain = .mydomain.com session.cookie_lifetime = 1800
3. PHPページの先頭で関数を呼び出す(1と同じ条件)
session_set_cookie_params(1800 , '/', '.mydomain.com');
これら 3 つの方法は同じ効果があります。
ここでは、最初の方法を使用して、www.mydomain.com と sub.mydomain.com という 2 つのドメイン名を設定してテストします。
sub1.php
sub2.php
アクセスシーケンス:
(1)www.mydomain.com/sub1.php
ページ出力: Array ( [sub1] => sub1 )
(2)sub.mydomain.com/sub2.php
ページ出力: Array ([sub1] => sub1 [sub2] => sub2 )
成功
2 番目の目標は、データベースを使用して SESSION データを保存することで達成できます。これにより、各サーバーが同じデータ ソースに簡単にアクセスして同じ SESSION データを取得できるようになります。または、NFS などのファイル共有を使用できます。 NFS を構成する)
セッション データを保存するためにデータベースを使用する場合、Web サイトのアクセス数が多い場合、データベース上で SESSION の読み取りと書き込みが頻繁に行われる可能性があります。これを memcache に置くことができます。データベースに保存されている、実装された過去の記事があります。データベースと memcache を組み合わせるというアイデアは以前に議論されました。 memcache を単独で使用してセッションを保存するのが適切でない場合は、memcache をデータベースと組み合わせるのが最善です。
2) クロスドメイン ソリューション
アイデア:
jsonp クロスドメインメソッドを使用して、別のドメインのログイン暗号化情報を取得し、このドメインでのログインを実現します。
または、iframe を使用して解決しますが、ff/IE はそれをサポートしていないため、前に p3p プロトコルを追加する必要があります。
P3P (Platform for Privacy Preferences Project) は、自分が善良であることを宣言し、ブラウザ ユーザーの行動の収集を可能にするプロトコルです。
しかし実際には、誰もが自分は善人だと言いながら、裏では悪いことをしているかもしれません。
ここに意見の相違があります。 【参考】国内のほとんどのWebサイトはこのP3Pに注目していません。プライバシーの問題は外国ほど真剣に受け止められていない可能性があります (Microsoft のプライバシーに関する声明)。
最初に思いつくのは、JS を通じて Cookie を操作し、2 つの異なるドメインの Cookie が相互にアクセスできるようにすることで、上記の効果を実現することです。
次に、具体的な実装プロセスを 2 つのステップに分けて示します。
1. システム A でログインに成功したら、JS を使用して非表示の iframe を動的に作成し、iframe の src 属性を使用して、ドメイン A の Cookie 値を get パラメータとしてシステム B の b.jsp ページにリダイレクトします。 🎜>
var _frm = document.createElement("iframe"); _frm.style.display="none"; _frm.src = "http://www.jbxue.com/setcookie.php?mycookie=xxxxx";//此处xxx最好编码 document.body.appendChild(_frm);
2、在B系统的setcookie.php页面中来获取A系统中所传过来的cookie值,并将所获取到值写入用户的cookie中,当然域是自己的了,这样就简单的实现了cookie跨域的访问; 不过这其中有个问题需要注意,就是在IE浏览器下这样操作不能成功,需要在setocokie.php页面中设置P3P HTTP Header就可以解决了(具体詳細信息可以参考:http://www.w3.org/P3P/),P3P设置代码为:
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');//ecshop这么设置的