web-dev-qa-db-ja.com

Cookieが無効になっているかどうかをサーバー側で検出する方法

ブラウザーのCookieが無効になっているかどうかをサーバー(サーバー側)で検出するにはどうすればよいですか?出来ますか?

詳細な説明:サーバーでHTTPリクエストを処理しています。 Set-Cookieヘッダーを介してCookieを設定します。その時点で、クライアントブラウザによってCookieが設定されるか、Cookieを設定するリクエストが無視されるかどうかを知る必要があります。

90

Cookieを設定してリダイレクト応答を送信します。 Cookieの(特別な)リダイレクトURLテストを処理する場合-存在する場合は通常の処理にリダイレクトし、そうでない場合はエラー状態にリダイレクトします。

これは、ブラウザがCookieの設定を許可したことを示すだけであり、どのくらいの期間ではないことに注意してください。私のFFでは、サイトが特別に例外リストに追加されていない限り、すべてのCookieを強制的に「セッション」モードにすることができます。そして、これは私が常にFFを実行するモードです。

56
Lawrence Dol

あなたはそれを達成するために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が有効になっている場合にのみ機能します!

45
balexandre

直接チェックする方法があるとは思わない。最善の方法は、値をCookieに保存し、それらを読み取って、Cookieが有効かどうかを判断することです。

18
Shoban

Cookieのサポートを確認する一般的な方法は、リダイレクト経由です。

ログインしたり、カートに何かを追加するなど、ユーザーがセッションを開始することを試みている場合にのみ、これを行うことをお勧めします。それ以外の場合、処理方法によっては、Cookieをサポートしていないユーザー(またはボット)に対してサイト全体へのアクセスをブロックする可能性があります。

まず、サーバーはログインデータを通常どおりチェックします。ログインデータが間違っている場合、ユーザーは通常どおりそのフィードバックを受け取ります。正しい場合、サーバーはすぐにCookieとそのCookieを確認するように設計されたページへのリダイレクトで応答します。これは、同じURLである場合がありますが、クエリ文字列にフラグが追加されます。その2番目のページがCookieを受信しない場合、ユーザーはブラウザでCookieが無効になっているためログインできないことを示すメッセージを受信します。

すでにログインフォームのPost-Redirect-Getパターンを使用している場合、このCookieの設定と確認は追加のリクエストを追加しません-Cookieは既存のリダイレクト中に設定でき、ロードする宛先によって確認できますリダイレクト後。

ここで、すべてのページのロード時以外にユーザーが開始したアクションの後にのみCookieテストを行う理由について説明します。サイトがすべてのページにCookieテストを実装しているのを見たことがありますが、これがサイトをクロールしようとする検索エンジンなどに影響を与えることを理解していません。つまり、ユーザーがCookieを有効にしている場合、テストCookieが1回設定されるため、要求する最初のページでリダイレクトに耐えるだけで、それ以降はリダイレクトされません。ただし、Cookieを返さないブラウザや検索エンジンなどのその他のユーザーエージェントの場合、すべてのページが単純にリダイレクトされる可能性があります。

Cookieのサポートを確認する別の方法は、Javascriptを使用することです(この方法では、リダイレクトは必ずしも必要ありません)。Cookieを書き込んですぐに読み戻して、保存されてから取得されるかどうかを確認できます。これのマイナス面は、スクリプトでクライアント側で実行されることです。つまり、サーバーに戻るためにCookieがサポートされているかどうかに関するメッセージが必要な場合は、それを整理する必要があります。 Ajax呼び出しで。

私自身のアプリケーションでは、ユーザーがログインする前にログイン画面にランダムトークンを含むCookieを設定し、ユーザーがログインを送信するときにそのトークンをチェックすることにより、CSRF攻撃の一種である「Login CSRF」攻撃に対する保護を実装しています詳細。 GoogleからのログインCSRFの詳細をご覧ください。これの副作用は、彼らがログインした瞬間に、私はそのクッキーの存在を確認できることです-追加のリダイレクトは必要ありません。

16
thomasrutter

通常、ユーザーがサイトで何らかのアクション(ログインフォームの送信、カートへのアイテムの追加など)を行った後にのみ、Cookieサポートを確認する必要があります。

私にとって現在、Cookieのサポートの確認はCSRF(クロスサイトリクエストフォージェリ)防止と密接に関係しています。

おそらく他の場所に行って CSRFの詳細 を読むべきですが、その背後にある考え方は、他のサイトがだましたり、ユーザーが自分のサイトに選択した隠しフォームを送信する可能性があるということです。これを回避する方法は、視聴者がフォームを表示するときにCookieを設定し、一致するトークンを非表示フォーム要素として設定し、フォームを処理するときに、Cookieと非表示フォーム要素の両方が設定され、互いに一致することを確認することです。 CSRF攻撃が試みられた場合、サイトはユーザーのCookieに一致する隠しフィールドを提供できません。ユーザーのCookieは同一生成元ポリシーでは読み取りできないためです。

Cookieを持たないフォームが送信されたが、有効なトークンが含まれている場合、ユーザーがCookieを無効にしていると結論付け、ユーザーがCookieを有効にして再試行する必要があることを示すメッセージをスローできます。もちろん、他の可能性は、ユーザーがCSRF攻撃の試みの被害者であることです。そのため、Cookieが一致しない場合にユーザーをブロックすると、その攻撃を防ぐ副作用もあります。

5
thomasrutter

私はいつもこれを使用しました:

navigator.cookieEnabled

w3schools によると、「cookieEnabledプロパティはすべての主要なブラウザーでサポートされています。」.

ただし、これはフォームを使用しているときに機能します。フォームでは、追加情報を送信するようブラウザに指示できます。

5
user1018130

クッキーに何かを保存してから、それを読んでください。期待どおりの結果が得られない場合、Cookieはおそらく無効になっています。

3
Joonas Pulakka

このコードを確認してください。

<?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());
2
user2511210

上記の「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>
1
Broote

クッキーが「有効」かどうかという質問はあまりにもブール値です。私のブラウザ(Opera)には、サイトごとのCookie設定があります。さらに、その設定はyes/noではありません。最も有用な形式は、実際には「セッションのみ」で、サーバーの有効期限は無視されます。設定後に直接テストすると、そこにあります。明日はそうではありません。

また、これは変更可能な設定であるため、Cookieが残っているかどうかをテストしても、設定についてはテストしたときのみがわかります。その1つのCookieを手動で受け入れることにしたかもしれません。スパムを送り続ける場合、そのサイトのCookieをオフにすることができます(場合によっては無効にします)。

1
MSalters

セッションCookie(セッションの存続期間中に存在するCookie)が有効になっているかどうかのみを確認する場合は、web.configファイルでセッションモードをAutoDetectに設定すると、Asp.NetフレームワークはAspxAutoDetectCookieSupportというCookieをクライアントブラウザーに書き込みます。その後、Request.CookiesコレクションでこのCookieを探して、クライアントでセッションCookieが有効になっているかどうかを確認できます。

例えば。 web.configファイルセットで:

<sessionState cookieless="AutoDetect" />

次に、クライアントでCookieが有効になっているかどうかを確認します。

if (Request.Cookies["AspxAutoDetectCookieSupport"] != null)  { ... }

補足:デフォルトでは、これはUseDeviceProfileに設定されており、クライアントがCookieをクライアントに書き込むことを試みますsupports Cookieが無効になっている場合でも。これが無意味なように見えるため、これがデフォルトのオプションであることは少し奇妙です-UseDeviceProfileに設定されたクライアントブラウザでCookieが無効になっていると、CookieをサポートしないクライアントのCookielessモードをサポートしている場合、セッションは動作しません、自動検出を使用して、無効にしたクライアントのCookieなしモードをサポートしてください...

1
magritte

NodeJS-サーバー側-Cookie Check Redirect Middleware-Express Session/Cookie Parser

依存関係

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()
}
1
indospace.io

cookieEnabledプロパティは、Cookieがブラウザで有効かどうかを指定するブール値を返します

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>
0
Zameer Khan