サーバー(サーバー側)で、ブラウザーのCookieが無効になっているかどうかをどのように検出できますか?出来ますか?
詳細説明:サーバーでHTTPリクエストを処理しています。Set-Cookie
ヘッダーでクッキーを設定したい。その時点で、Cookieがクライアントブラウザによって設定されるのか、それともCookieを設定するリクエストが無視されるのかを知る必要があります。
サーバー(サーバー側)で、ブラウザーのCookieが無効になっているかどうかをどのように検出できますか?出来ますか?
詳細説明:サーバーでHTTPリクエストを処理しています。Set-Cookie
ヘッダーでクッキーを設定したい。その時点で、Cookieがクライアントブラウザによって設定されるのか、それともCookieを設定するリクエストが無視されるのかを知る必要があります。
回答:
Cookieを設定してリダイレクト応答を送信します。Cookieの(特別な)リダイレクトURLテストを処理する場合-存在する場合は通常の処理にリダイレクトし、それ以外の場合はエラー状態にリダイレクトします。
これは、ブラウザがcookieの設定を許可したことを通知するだけで、どのくらいの期間は通知しないことに注意してください。私のFFでは、サイトが例外リストに明示的に追加されていない限り、すべてのCookieを強制的に「セッション」モードにすることができます。このようなCookieは、サーバーの指定された有効期限に関係なく、FFがシャットダウンすると破棄されます。そして、これは私がFFを常に実行するモードです。
あなたはそれを達成するためにJavaScriptを使うことができます
図書館:
function createCookie(name, value, days) {
var expires;
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
}
else expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name, "", -1);
}
function areCookiesEnabled() {
var r = false;
createCookie("testing", "Hello", 1);
if (readCookie("testing") != null) {
r = true;
eraseCookie("testing");
}
return r;
}
実行するコード:
alert(areCookiesEnabled());
覚えて
これは、JavaScriptが有効になっている場合にのみ機能します。
Cookieのサポートを確認する一般的な方法は、リダイレクトを使用することです。
ユーザーがログインやカートへの追加など、セッションを開始する何かを実行しようとしている場合にのみ、これを実行することをお勧めします。それ以外の場合は、処理方法によっては、Cookieをサポートしていないユーザー(またはボット)のサイト全体へのアクセスがブロックされる可能性があります。
最初に、サーバーはログインデータを通常どおりにチェックします。ログインデータが間違っている場合、ユーザーは通常どおりフィードバックを受け取ります。それが正しい場合、サーバーはすぐにCookieとそのCookieをチェックするように設計されたページへのリダイレクトで応答します。これは同じURLである可能性がありますが、クエリ文字列にいくつかのフラグが追加されています。その2番目のページがcookieを受信しない場合、ユーザーはブラウザでcookieが無効になっているためログインできないことを示すメッセージを受信します。
ログインフォームのPost-Redirect-Getパターンに従っている場合、この設定とCookieの確認では追加のリクエストは追加されません。既存のリダイレクト中にCookieを設定し、ロード先で確認できます。リダイレクト後。
ここで、ページの読み込みごとではなく、ユーザーが開始したアクションの後でのみCookieテストを実行する理由を説明します。サイトがすべてのページにCookieテストを実装するのを見てきましたが、これがサイトをクロールしようとする検索エンジンなどに影響を与えることに気づいていません。つまり、ユーザーがCookieを有効にしている場合、テストCookieは1回設定されるため、要求した最初のページでリダイレクトに耐えるだけで、それ以降はリダイレクトされません。ただし、Cookieを返さないブラウザやその他のユーザーエージェント(検索エンジンなど)では、すべてのページがリダイレクトされるだけです。
Cookieのサポートを確認するもう1つの方法はJavascriptを使用する方法です。この方法では、リダイレクトは必ずしも必要ではありません。Cookieを書き込んで、すぐに読み取って、保存されているかどうかを確認できます。これの欠点は、スクリプトで実行されることです。クライアント側のれることです。つまり、Cookieがサポートされているかどうかに関するメッセージがサーバーに戻るようにしたい場合は、Ajax呼び出しなどを使用して、それを整理する必要があります。
私のアプリケーションでは、ユーザーがログインする前にログイン画面にランダムトークンを含むCookieを設定し、ユーザーがログインを送信するときにそのトークンをチェックすることで、CSRF攻撃の一種である「ログインCSRF」攻撃に対する保護を実装しています詳細。GoogleのLogin CSRFの詳細をご覧ください。この副作用として、ユーザーがログインした瞬間に、そのCookieの存在を確認できます。追加のリダイレクトは必要ありません。
通常、ユーザーがサイトで何らかの操作(ログインフォームの送信、カートへのアイテムの追加など)を行った後にのみ、Cookieのサポートを確認する必要があります。
現在のところ、Cookieサポートの確認はCSRF(Cross-Site Request Forgery)防止と密接に関連しています。
おそらく他の場所に行ってCSRFの詳細を読む必要がありますが、その背後にある考えは、他のサイトがだまされたり、ユーザーが選択した非表示のフォームを自分のサイトに送信したりする可能性があるということです。これを回避する方法は、ビューアがフォームを表示したときにCookieを設定し、一致するトークンを非表示のフォーム要素として設定し、フォームを処理するときに、Cookieと非表示のフォーム要素の両方が設定され、互いに一致することを確認します。それが試みられたCSRF攻撃である場合、ユーザーのCookieは同一生成元ポリシーの下ではユーザーに読み取られないため、サイトはユーザーのCookieと一致する非表示フィールドを提供できません。
フォームがCookieなしで送信されたが、有効なトークンが含まれている場合、これにより、ユーザーがCookieを無効にしていると結論付け、ユーザーがCookieを有効にして再試行する必要があることを示すメッセージをスローできます。もちろん、もう1つの可能性は、ユーザーがCSRF攻撃の犠牲になったことです。したがって、Cookieが一致しない場合にユーザーをブロックすると、その攻撃を防止するという副作用が生じます。
私はいつもこれを使いました:
navigator.cookieEnabled
w3schoolsによると、「CookieEnabledプロパティはすべての主要なブラウザでサポートされています。」
ただし、これは私がフォームを使用しているときに機能します。ここで、追加情報を送信するようにブラウザーに指示できます。
何かをCookieに保存してから、読み取ってください。期待どおりの結果が得られない場合、Cookieはおそらく無効になっています。
このコードを確認してください、それはあなたを助けるでしょう。
<?php
session_start();
function visitor_is_enable_cookie() {
$cn = 'cookie_is_enabled';
if (isset($_COOKIE[$cn]))
return true;
elseif (isset($_SESSION[$cn]) && $_SESSION[$cn] === false)
return false;
// saving cookie ... and after it we have to redirect to get this
setcookie($cn, '1');
// redirect to get the cookie
if(!isset($_GET['nocookie']))
header("location: ".$_SERVER['REQUEST_URI'].'?nocookie') ;
// cookie isn't availble
$_SESSION[$cn] = false;
return false;
}
var_dump(visitor_is_enable_cookie());
Cookieが「有効」であるかどうかの質問はブール値です。私のブラウザー(オペラ)には、サイトごとのCookie設定があります。さらに、その設定はyes / noではありません。最も便利な形式は、実際には「セッションのみ」で、サーバーの有効期限は無視されます。設定直後にテストすればそこにあります。明日はそうなりません。
また、これは変更可能な設定であるため、Cookieが残っているかどうかをテストしても、テストしたときの設定のみがわかります。その1つのCookieを手動で受け入れることにしたのかもしれません。スパム行為を続けている場合は、そのサイトのCookieをオフにすることができます(場合によってはオフにします)。
セッションCookie(セッションの存続期間中に存在するCookie)が有効かどうかのみを確認する場合は、web.configファイルでセッションモードをAutoDetectに設定すると、Asp.NetフレームワークがクライアントブラウザーにCookieを書き込みますAspxAutoDetectCookieSupportと呼ばれる。次に、Request.CookiesコレクションでこのCookieを探し、クライアントでセッションCookieが有効になっているかどうかを確認します。
たとえば、web.configファイルセットで:
<sessionState cookieless="AutoDetect" />
次に、クライアントでCookieが有効になっているかどうかを確認します。
if (Request.Cookies["AspxAutoDetectCookieSupport"] != null) { ... }
サイドノート:デフォルトでは、これはUseDeviceProfileに設定されています。これにより、Cookieが無効になっている場合でも、クライアントがそれらをサポートしている限り、Cookieがクライアントに書き込まれます。これは無意味に見えるので、これがデフォルトのオプションであることは少し奇妙です-UseDeviceProfileに設定されたクライアントブラウザで無効にされたCookieでセッションが機能せず、CookieをサポートしないクライアントでCookieなしモードをサポートする場合では、AutoDetectを使用して、無効になっているクライアントのCookieなしモードをサポートしてください...
私は上記の「balexandre」の答えをより単純化したバージョンを使用しています。Cookieが有効かどうかを判断することのみを目的として、セッションCookieの設定と読み取りを試みます。はい、これにはJavaScriptも有効にする必要があります。したがって、タグが必要な場合は、そこにタグが必要になることがあります。
<script>
// Cookie detection
document.cookie = "testing=cookies_enabled; path=/";
if(document.cookie.indexOf("testing=cookies_enabled") < 0)
{
// however you want to handle if cookies are disabled
alert("Cookies disabled");
}
</script>
<noscript>
<!-- However you like handling your no JavaScript message -->
<h1>This site requires JavaScript.</h1>
</noscript>
NodeJS-サーバー側-Cookieチェックリダイレクトミドルウェア-Expressセッション/ Cookieパーサー
依存関係
var express = require('express'),
cookieParser = require('cookie-parser'),
expressSession = require('express-session')
ミドルウェア
return (req, res, next) => {
if(req.query.cookie && req.cookies.cookies_enabled)
return res.redirect('https://yourdomain.io' + req.path)
if(typeof(req.cookies.cookies_enabled) === 'undefined' && typeof(req.query.cookie) === 'undefined') {
return res.cookie('cookies_enabled', true, {
path: '/',
domain: '.yourdomain.io',
maxAge: 900000,
httpOnly: true,
secure: process.env.NODE_ENV ? true : false
}).redirect(req.url + '?cookie=1')
}
if(typeof(req.cookies.cookies_enabled) === 'undefined') {
var target_page = 'https://yourdomain.io' + (req.url ? req.url : '')
res.send('You must enable cookies to view this site.<br/>Once enabled, click <a href="' + target_page + '">here</a>.')
res.end()
return
}
next()
}
cookieEnabled
プロパティは、指定かどうかをブラウザでクッキーが有効になっていることをブール値を返します。
<script>
if (navigator.cookieEnabled) {
// Cookies are enabled
}
else {
// Cookies are disabled
}
</script>
<?php session_start();
if(SID!=null){
echo "Please enable cookie";
}
?>