IDが$_SESSION
に保存されているサイトにユーザーをログオンさせ、ブラウザから[保存]ボタンをクリックすると、サーバーにAJAXリクエストが送信されます。彼の$_SESSION
とCookieはこのリクエストで保持されますか?$_SESSION
に存在するIDに安全に依存できますか?
答えはイエスです。
セッションはサーバー側で維持されます。サーバーに関する限り、AJAXリクエストと通常のページリクエストに違いはありません。どちらもHTTPリクエストであり、どちらも同じ方法でヘッダーにCookie情報が含まれています。
クライアント側から、通常のリクエストであろうとAJAXリクエストであろうと、同じCookieが常にサーバーに送信されます。 Javascriptコードは特別なことをする必要はありません。また、この出来事を認識する必要さえありません。通常のリクエストと同じように機能します。
PHPファイルにAJAXリクエストにsession_start()
がある場合、セッション情報は保持されます。 (リクエストが同じドメイン内にある場合)
あなたが本当に得ているのは、CookieがAJAXリクエストで送信されていますか? AJAXリクエストが同じドメイン(またはCookieのドメイン制約内)に対するものであると仮定すると、答えはイエスです。したがって、同じサーバーへのAJAXリクエストは同じセッション情報を保持します(呼び出されたスクリプトが、セッション情報へのアクセスを必要とする他のPHPスクリプトごとにsession_start()を発行すると仮定します)。
まあ、常にではありません。クッキーを使用して、あなたは良いです。しかし、「存在するIDに安全に頼ることができますか」は重要な点で議論を拡張するよう促しました(このページの訪問者数は非常に多いようです)。
PHPは、CookieではなくURL書き換えによってセッションを維持するように構成できます。 ( どのように良いか悪いか (<-たとえば、一番上のコメントを参照)は 個別の質問 で、現在のものに固執しましょう、1つのサイドノートで:URLベースのセッションで最も顕著な問題-裸のセッションIDの露骨な可視性-は、内部Ajax呼び出しの問題ではありませんが、Ajaxで有効にすると、有効になりますサイトの残りの部分についても同様ですので、...)
URL書き換え(Cookieなし)セッションの場合、Ajax呼び出しは、リクエストURLが適切に作成されていることを自分で処理する必要があります。 (または、独自のカスタムソリューションを展開することもできます。セッションの維持に頼ることもできます クライアント側で 、要求の少ないケースです。)ポイントはexplicit careCookieを使用しない場合、セッションの継続に必要:
Ajaxが(PHPから受け取った)HTMLからextractURLをそのまま呼び出す場合は、すでにクックされている(umm、cookified)ので問題ありません。
URI自体をassembleする必要がある場合は、セッションIDをURLに手動で追加する必要があります。 ( here 、またはPHP( with URL-rewriting on )によって生成されたページソースを確認して、その方法を確認してください。)
OWASP.org から:
実質的に、Webアプリケーションは両方のメカニズム、CookieまたはURLパラメーターを使用でき、特定の条件が満たされた場合(URLの自動書き換えなど)に切り替えることもできます(たとえば、 Cookieのサポート、またはユーザーのプライバシーの懸念によりCookieが受け入れられない場合)
Ruby-forum 投稿から:
Cookieでphpを使用する場合、Ajax XMLHttpRequestsの場合でも、セッションIDは要求ヘッダーで自動的に送信されます。 URLベースのPHPセッションを使用または許可する場合、すべてのAjaxリクエストURLにセッションIDを追加する必要があります。
AJAXリクエストがセッションを保持することは非常に重要です。最も簡単な例は、管理パネルに対してAJAXリクエストを実行しようとした場合です。もちろん、管理者ログイン後に取得したセッションを持たない他のユーザーがアクセスできないように、リクエストを行うページを保護します。理にかなっていますか?
ただし、特にフレームワークを使用している場合は、アプリケーションがリクエスト間でセッションIDを再生成しているかどうかを確認する必要があります-セッションIDに明示的に依存するものはすべて問題になりますが、セッションは影響を受けません。
アプリケーションがこのようなセッションIDを再生成している場合、最終的にajaxリクエストがリクエストページのセッションIDを無効化/置換する状況になる可能性があります。
ajaxリクエストを受け付けるすべてのサーバー側ページにsession()認証を配置します。
if(require_once("auth.php")) {
//run json code
}
// do nothing otherwise
それは私がそれをやった唯一の方法です。
それがフレームワークが行うことです、例えばフロントコントローラーまたはboostrapスクリプトでセッションを初期化する場合、ページコントローラーまたはajaxコントローラーの初期化を気にする必要はありません。 PHPフレームワークは万能薬ではありませんが、このような非常に多くの有用なことを行います!