私のユーザーが自分のサイトにログオンし、IDがに保存されていて$_SESSION
、ブラウザーから[保存]ボタンをクリックすると、サーバーにAJAXリクエストが送信されます。彼$_SESSION
とCookieはこのリクエストで保持され$_SESSION
ますか?また、IDが存在することを安全に信頼できますか?
私のユーザーが自分のサイトにログオンし、IDがに保存されていて$_SESSION
、ブラウザーから[保存]ボタンをクリックすると、サーバーにAJAXリクエストが送信されます。彼$_SESSION
とCookieはこのリクエストで保持され$_SESSION
ますか?また、IDが存在することを安全に信頼できますか?
回答:
答えはイエスです:
セッションはサーバー側で維持されます。サーバーに関する限り、AJAX要求と通常のページ要求の間に違いはありません。どちらもHTTPリクエストであり、どちらも同じ方法でヘッダーにCookie情報を含みます。
クライアント側からは、通常のリクエストでもAJAXリクエストでも、常に同じCookieがサーバーに送信されます。Javascriptコードは特別なことをする必要はなく、これが発生していることを認識する必要さえありません。通常のリクエストの場合と同じように機能します。
Warning: session_write_close(): Failed to write session data (user)
最近プロジェクトで断続的にエラーが発生していますが、残りのページの読み込み中にAJAXリクエストが発生した場合のみです。セッションデータにMySQL DBを使用していますが、メインページのリクエストがそのテーブルをロックしているため、AJAXリクエストがテーブルにアクセスできない可能性があります。
あなたが本当に得ているのは、AJAXリクエストでCookieが送信されているかということです。AJAX要求が同じドメイン(またはCookieのドメイン制約内)に対するものであるとすると、答えは「はい」です。そのため、同じサーバーへのAJAXリクエストは同じセッション情報を保持します(呼び出されたスクリプトがセッション情報へのアクセスを必要とする他のPHPスクリプトと同様にsession_start()を発行すると想定)。
ええと、いつもではありません。クッキーを使用すると、あなたは良いです。しかし、「存在するidに安全に依存できますか」ということで、重要なポイント(このページの訪問者数は非常に多いように見えるので、主に参照用)で議論を拡張するように促されました。
PHPは、Cookieの代わりにURL書き換えによってセッションを維持するように構成できます。(それが良いか悪いか(<-たとえば、そこにある一番上のコメントを参照)は別の質問です、今一つのサイドノートで現在の質問に固執しましょう:URLベースのセッションで最も顕著な問題-露骨なネイキッドセッションIDの可視性-内部Ajax呼び出しの問題ではありませんが、Ajaxで有効になっている場合は、サイトの他の部分でも有効になっているので...)
URL書き換え(Cookieなし)セッションの場合、Ajax呼び出しは、要求URLが適切に作成されていることを自分で処理する必要があります。(または、独自のカスタムソリューションをロールバックすることもできます。要求の少ないケースでは、クライアント側でセッションを維持することもできます。)ポイントは、Cookieを使用しない場合でも、セッションの継続性に必要な明示的な注意です。
Ajax呼び出しがHTMLからそのままURLを抽出するだけの場合(PHPから受信した場合)、それらは既にクックされている(うーん、クックされている)ため、問題ありません。
リクエストURIを自分でアセンブルする必要がある場合は、セッションIDを手動でURLに追加する必要があります。(ここを確認するか、PHPによって生成されたページソース(URL書き換えがオンの場合)を確認してください。)
OWASP.orgから:
事実上、Webアプリケーションは、メカニズム、CookieまたはURLパラメータの両方を使用できます。また、特定の条件が満たされた場合(たとえば、CookieがサポートされていないWebクライアントの存在、またはCookieがサポートされていない場合)、一方から他方に切り替えることもできます(自動URL書き換え)ユーザーのプライバシー問題のために受け入れられた)。
ルビー・フォーラムのポスト:
cookieでphpを使用する場合、Ajax XMLHttpRequestsの場合でも、セッションIDはリクエストヘッダーで自動的に送信されます。 URLベースのphpセッションを使用または許可する場合は、すべてのAjaxリクエストURLにセッションIDを追加する必要があります。
AJAXリクエストがセッションを保持することは非常に重要です。最も簡単な例は、管理パネルに対してAJAXリクエストを実行しようとした場合です。もちろん、管理者のログイン後に取得したセッションを持たない他の人がアクセスできないように、リクエストを行うページを保護します。理にかなっていますか?
ajaxリクエストを受け入れるすべてのサーバーサイドページにsession()認証を配置します。
if(require_once("auth.php")) {
//run json code
}
// do nothing otherwise
これが、私がこれまでに行った唯一の方法です。
HttpOnly
Cookieを設定するときにフラグを設定できます。これは、JavaScriptがCookieを認識できないことを意味します。ただし、Cookie は引き続きAJAXと通常のページ要求の両方に対して送信され、まったく同じように機能し続けます。あなたのJavascriptはそれをに表示しませんdocument.cookie
。