1

状況:

PHP/MySQL/Zend Framework 1.12 バックエンドと通信する Javascript/jQuery Web アプリがあります。Web アプリは iFrame 内で実行されます (iframe モードの jQuery fancybox で読み込まれます)。

アプリケーションはバックエンドでオブジェクトを作成し、現在のセッション ID を一緒に保存します。次に、オブジェクトのプロパティをフロントエンドに表示し、ユーザーがアプリケーションと対話するときに ajax 呼び出しを介してバックエンドでオブジェクトを変更します。セッション ID は、ajax リクエストが同じユーザーから来ているかどうかを確認するために使用されます (ユーザーはログインしていないため、確認する唯一の方法です)。

jQuery を使用して ajax 呼び出しを行い、Zend_Session を使用して PHP/Zend のセッションを操作します。

問題:

問題は、safari 6 では、これらの ajax リクエストのセッション ID が異なるため、バックエンド モデル オブジェクトに保存されているセッション ID と一致せず、アクセスが拒否されることです。

これは iframe で実行している場合にのみ発生し、他のブラウザーではなく、他のバージョンの safari (5 以下) では発生しません。

これを引き起こす原因と対処方法を知っている人はいますか?

いくつかの詳細情報:

アプリケーション全体が iframe で実行され、セッション ID がバックエンド モデルにも格納される呼び出しから実行されます。したがって、これらの呼び出しはすべて同じセッション ID を持っていると思います。

別のこと: アプリケーションを別のタブで実行し、iframe で再度実行すると、問題はなくなります。それ以降、ブラウザー セッションを強制終了するまで、期待どおりに毎回同じセッション ID を取得します。率直に言って、それは私にはバグのようなにおいがします。

4

1 に答える 1

1

重要な問題は iFrame です。Safari セキュリティ モデルの一部として、iFrame で実行されるリクエストは、残りのページ リクエストとは別に処理されます。これは、サードパーティの Cookie 保護の一部です。私が理解しているように、Firefox22 は同じようなことを始めようとしていますが、それほど制限的ではありません。

本当にこれを回避したい場合は、PHP のセッション ID Cookie を取り出して、iFrame へのリクエストのクエリ文字列に配置します。次に、クエリ文字列からセッション ID を取得して、それを使用できます。(これを行うと、Cookie データに 1 つが残ることはありません。)

于 2013-02-28T18:03:48.663 に答える