SESSION がドメインを越えることができないことは誰もが知っています。つまり、ドメイン A.WEMVC.COM の実行可能ファイルは B.WEMVC.COM の SESSION にアクセスできません。これは SESSION の機能であり、これはセキュリティの観点から言えば当てはまります。
通常の状況では、Web サイトのドメイン名は 1 つだけですが、一部の Web サイト構造は複数のサブドメイン名で構成されているため、SESSION はサブドメイン間でアクセスできる必要があります。これにより、ユーザーのクロスドメイン ログインが可能になります。つまり、顧客が A でログインすると、同時に B もログインする必要がなくなります。もちろん、クロスドメインではない SESSION 自体でもこれを行うことができます。もちろん、クロスドメインの後の SESSION についてはどうなるでしょうか。 、あなたもクロスドメイン SESSION について心配していて、この記事を見つけたかもしれません。おめでとうございます。今日のコースを始めましょう。SESSION を実現するには、COOKIE と SESSION を併用します。
まず、PHP の COOKIE と SESSION を確認してみましょう:
COOKIE:
定義:
Cookie はユーザーを識別するためによく使用されます。 Cookie は、サーバーがユーザーのコンピュータ上に残す小さなファイルです。同じコンピュータがブラウザを通じてページをリクエストするたびに、Cookie も送信されます。 PHP を使用すると、Cookie 値を作成および取得できます。 PS: 中国語名は「Cookie」です。
COOKIE を設定するには、PHP の setCookie 関数を使用します。この関数には、合計 7 つのパラメータがあります。は 6 です。申し訳ありませんが、同時に、PHP5.2.0 バージョンでは 7 つのパラメータに増加しました。)、これらの 7 つのパラメータは文字列 $ です。 name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly ]]]]]] .
name Cookie の名前を指定します。クッキーの名前。
value この値はクライアントのコンピューターに保存されます。name は 'cookiename' です。この値は $_COOKIE['cookiename'] を通じて取得されます。Cookie の値を指定します。
expire これは Unix タイムスタンプなので、エポックからの秒数です。つまり、これを設定する可能性が高くなります。 time() 関数に有効期限が切れるまでの秒数を加えます。または、mktime() を使用することもできます。time()+60*60*24*30 は、Cookie が 30 日で期限切れになるように設定します。0 に設定するか省略した場合、Cookie はセッションの終了時 (ブラウザーが閉じたとき) に期限切れになります。
注: expire パラメータは、日付形式 Wdy, DD-Mon- ではなく、Unix タイムスタンプを使用していることに気づくかもしれません。 YYYY HH:MM:SS GMT、これは、PHP がこの変換を内部で行うためです。
expire は、サーバーの時間とは異なる可能性があるクライアントの時間と比較されます。
path Cookie が使用できるサーバー上のパス。 ‘/’ に設定すると、Cookie は ドメイン 全体内で使用可能になります。 '/foo/' に設定すると、Cookie は /foo/ ディレクトリと、/foo/bar/ の ドメイン 。デフォルト値は、Cookie が設定されている現在のディレクトリです。Cookie のサーバー経路径を定義します。
domain Cookie が使用できるドメイン。 example.com のすべてのサブドメインで Cookie を利用できるようにするには、Cookie を ‘.example.com’ に設定します。 . は必須ではありませんが、より多くのブラウザーと互換性があります。 www.example.com に設定すると、Cookie は www サブドメインでのみ使用可能になります。詳細については、» 仕様 の末尾マッチングを参照してください。 Cookie のドメイン名を定義します。クライアントからの接続。
TRUE に設定すると、安全な接続が存在する場合にのみ Cookie が設定されます。デフォルトは FALSE です。サーバー側では、この種の Cookie を安全な接続でのみ送信するのはプログラマの役割です (例: $_SERVER["HTTPS"] に関して)。 httponly
TRUE の場合、Cookie は HTTP プロトコル経由でのみアクセス可能になります。これは、JavaScript などのスクリプト言語から Cookie にアクセスできないことを意味します。この設定は、XSS 攻撃による個人情報の盗難を効果的に減らすのに役立ちます (ただし、すべてのブラウザーでサポートされているわけではありません)。 PHP 5.2.0で追加されました。 TRUE または FALSE。规定かどうかは必ず通過HTTP协议来定义访问COOKIE、防止XSS攻撃击.SESSION全面教程SESSION在这里就不过多的讲解了,主是:
哈哈,不是我懒噢,这里只讲跨域.
OK,大概温习了下COOKIEとSESSION,开始实现我们的跨域.
首先我描述下我的思路,COOKIE可指定領域名,也例:setcookie('name','joshua',time()+3600*24,'/','wemvc.com'),那么A.wemvc.com,B.wemvc .com都可$_COOKIE['name']、すべて'joshua'.同理、SESSION IDもこのドメイン名に設定でき、那么A.wemvc.comとB.wemvc.com都が同じを取得できます。 1 つの SESSION ID、那么我们の目的は達成されました。同じ SESSION ID を知っているため、この SESSION 内の制限にアクセスできます。SESSION にはさまざまな方法で保存されており、テキスト パケット内に保存されているなど、データ ソースが保存されています。 A.wemvc.com、B.wemvc.com は同じ台のサーバー上に存在せず、那么内に保存されるファイルの保存方法は、完全にフィールドを超えて、最後まで方法がなく、本人も何も説明しません。
最初にデータベースにあります。中创建一セッション表:
CREATE TABLE `sessions` (
`sid` varchar(32) NOT NULL デフォルト '',
`expiry` int(20) unsigned NOT NULL デフォルト ' 0',
`value` テキスト NOT NULL,
PRIMARY KEY (`sid`),
KEY `expiry` (`expiry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
その後、一のクラスを書き込み、このクラスは取取入力更新および垃圾回收SESSION
class session{
private $db;
function __construct($db) {
$this->db=$db;
}
public function open($save_path,$session_name){
return true;
}
public function close() {
$this->db=null;
return true;
}
public function read($sid){
$rs=$this->db->query ("sid='".$sid."'" のセッションから * を選択);
foreach ($rs as $row){
return $row['value'];
}
return null;
}
public function write($sid,$value){
if(is_null($oldvalue=$this->read($sid))){
// insert
return $this->db->query(”セッションに挿入 (sid,expiry,value)values('”.$sid.”','”.time().”','” .$value.”')”);
}else{
//update
return $this->db->query(”更新セッション set expiry='”.time(). ”',value='”.$value.”' where sid='”.$sid.”'”);
}
}
public function destroy($sid){
return $this->db->query(”sid='”.$sid.”'”のセッションから削除);
}
public function gc($max_life_time){
return $this ->db->query('expiry+'.$max_life_time.'<'.time());
}
}
我来解释下这个类:
private $db; クラスの DATABASE 属性。
function __construct($db) クラスを宣言するときに、クラスに DB 属性を直接渡すこともできます。理解してください。最初に GOOGLE で「PHP クラス コンストラクト」メソッドを実行できます。
public function open($save_path,$session_name) セッションが開かれます。特別なことは必要ありません。直接 TRUE を返します。
public function close() session close は open と同じですが、DB 接続を閉じることに注意してください。
public function read($sid) セッションは読み取り、値 SID を渡し、この SID の VALUE を戻り値としてデータ テーブルに返します。 ;
public function write($sid,$value) セッションの書き込みと更新、なぜ expiry='".time()."' を設定するのかという疑問が生じるでしょう。答えは、期限切れのクリアで後で明らかになります。 SESSION GC メソッド;
public function destroy($sid) セッションの破棄は非常に簡単で、データ テーブル内のこの SID に等しいデータを削除するだけです。
public function gc($max_life_time) は期限切れのセッションをクリアします。 max_life_time を超えるすべての SESSION を破棄します。つまり、SESSION の作成時間と最大生存時間の合計が時間 (expiry+'.$max_life_time.'<'.time()) よりも小さい SESSION データが削除されます。 SESSION の記述と更新のメソッドに現在時刻が記述される理由は理解できます。もちろん、この記述方法は絶対に必要ではありません。SQL が正しく記述されている限り、それはあなた次第です。
それでは、次に進みます。さらに重要な部分:
上記のクラスにはデータベース リンク属性が必要なので、オブジェクトを宣言するときは次のようにする必要があります:
$session=new session(your db connectadapter);
データベース リンク PDO メソッドを提供できます。参照してください:
function connect_db( $arrPDODB){
$db=new PDO($arrPDODB['db_driver'].': host='.$arrPDODB['db_host'].';dbname='.$arrPDODB['db_name'],$ arrPDODB['db_user'],$arrPDODB['db_password']);
$db-> ;query("set names 'utf8''");
return $db;
}
したがって、オブジェクト宣言部分は次のように書くことができます:
$session=new session(connect_db($arrPDODB));
Next:
//カラーセッションIDの名前を設定します
ini_set('session.name', 'sid ');
//GET/POST 変数メソッドを使用しない
ini_set('session.use_trans_sid', 0);
//ガベージ コレクションの最大有効期間を設定します
ini_set('session. gc_maxlifetime', 3600);
//COOKIE を使用してセッション ID を保存します
ini_set('session.use_cookies', 1) ;
ini_set('session.cookie_path', '/');
//複数のホストが SESSION ID を保存する COOKIE を共有します。ここでのドメイン名は第 1 レベルのドメイン名であることに注意してください。
ini_set('session.cookie_domain', ' wemvc.com');
//デフォルトのファイルではなく session.save_handler を user に設定します
session_module_name('user');
session_set_save_handler(array($session ,'open'),
array($session,' close')、
array($session,'read')、
array($session,'write')、
array( $session,'destroy')、
array($session ,'gc'));
上記は SESSION の設定です。理解できない場合は、マニュアルを検索して学習してください。それについて少し知っているだけで理解した、またはマスターしたと考えるのではなく、知識ポイントを徹底的に理解します。
最後に、必要な場所でセッションを開始します。
session_start( ; そして開始します。もちろん、このプログラムはドメインをまたぐこともできます (笑)。次の ブログ投稿
を書く前に、自分で勉強してみてください。実際、AJAX はサブドメインをまたぐこともできます。これが私の次の
ブログ投稿への道を開きました。笑、皆さんも私と議論して学んでください。2008 年 9 月更新。 26 日:
新しいデモ プログラムが追加されました。プログラムは非常にシンプルで、初心者の学習に適しています。demo_session_1プログラムの説明: 2 つのフォルダー a と b は、仮想マシンを a.yourdomain.com と b.yourdomain.com に設定するだけです。まずこれを理解してから、セッションをデータベースに保存することを検討してください。セッションをデータベースに保存する主な理由は、Web サイトに複数のサーバーがある場合、セッションがデフォルトのファイル タイプで保存されたままだと、複数のサーバーが機能しないためです。
demo_session 2
プログラム説明: このプログラムは、ウェアハウジング機能、データテーブルの作成、および上記のファイルを追加します。