web-dev-qa-db-ja.com

AJAXリクエストはPHPセッション情報を保持しますか?

IDが$_SESSIONに保存されているサイトにユーザーをログオンさせ、ブラウザから[保存]ボタンをクリックすると、サーバーにAJAXリクエストが送信されます。彼の$_SESSIONとCookieはこのリクエストで保持されますか?$_SESSIONに存在するIDに安全に依存できますか?

149
Click Upvote

答えはイエスです。

セッションはサーバー側で維持されます。サーバーに関する限り、AJAXリクエストと通常のページリクエストに違いはありません。どちらもHTTPリクエストであり、どちらも同じ方法でヘッダーにCookie情報が含まれています。

クライアント側から、通常のリクエストであろうとAJAXリクエストであろうと、同じCookieが常にサーバーに送信されます。 Javascriptコードは特別なことをする必要はありません。また、この出来事を認識する必要さえありません。通常のリクエストと同じように機能します。

185
thomasrutter

PHPファイルにAJAXリクエストにsession_start()がある場合、セッション情報は保持されます。 (リクエストが同じドメイン内にある場合)

23
Ólafur Waage

あなたが本当に得ているのは、CookieがAJAXリクエストで送信されていますか? AJAXリクエストが同じドメイン(またはCookieのドメイン制約内)に対するものであると仮定すると、答えはイエスです。したがって、同じサーバーへのAJAXリクエストは同じセッション情報を保持します(呼び出されたスクリプトが、セッション情報へのアクセスを必要とする他のPHPスクリプトごとにsession_start()を発行すると仮定します)。

23
cletus

まあ、常にではありません。クッキーを使用して、あなたは良いです。しかし、「存在するIDに安全に頼ることができますか」は重要な点で議論を拡張するよう促しました(このページの訪問者数は非常に多いようです)。

PHPは、CookieではなくURL書き換えによってセッションを維持するように構成できます。 どのように良いか悪いか (<-たとえば、一番上のコメントを参照)は 個別の質問 で、現在のものに固執しましょう、1つのサイドノートで:URLベースのセッションで最も顕著な問題-裸のセッションIDの露骨な可視性-は、内部Ajax呼び出しの問題ではありませんが、Ajaxで有効にすると、有効になりますサイトの残りの部分についても同様ですので、...)

URL書き換え(Cookieなし)セッションの場合、Ajax呼び出しは、リクエストURLが適切に作成されていることを自分で処理する必要があります。 (または、独自のカスタムソリューションを展開することもできます。セッションの維持に頼ることもできます クライアント側で 、要求の少ないケースです。)ポイントはexplicit careCookieを使用しない場合、セッションの継続に必要:

  1. Ajaxが(PHPから受け取った)HTMLからextractURLをそのまま呼び出す場合は、すでにクックされている(umm、cookified)ので問題ありません。

  2. 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を追加する必要があります。

8
Sz.

AJAXリクエストがセッションを保持することは非常に重要です。最も簡単な例は、管理パネルに対してAJAXリクエストを実行しようとした場合です。もちろん、管理者ログイン後に取得したセッションを持たない他のユーザーがアクセスできないように、リクエストを行うページを保護します。理にかなっていますか?

ただし、特にフレームワークを使用している場合は、アプリケーションがリクエスト間でセッションIDを再生成しているかどうかを確認する必要があります-セッションIDに明示的に依存するものはすべて問題になりますが、セッションは影響を受けません。

アプリケーションがこのようなセッションIDを再生成している場合、最終的にajaxリクエストがリクエストページのセッションIDを無効化/置換する状況になる可能性があります。

0
John

ajaxリクエストを受け付けるすべてのサーバー側ページにsession()認証を配置します。

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

それは私がそれをやった唯一の方法です。

0
brianabee7

それがフレームワークが行うことです、例えばフロントコントローラーまたはboostrapスクリプトでセッションを初期化する場合、ページコントローラーまたはajaxコントローラーの初期化を気にする必要はありません。 PHPフレームワークは万能薬ではありませんが、このような非常に多くの有用なことを行います!

0
AlexA