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


91

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

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


どこ?ブラウザ(クライアント側)で?またはサーバーで?(どのサーバー)
Assaf Lavie、

7
サーバー側のコードでCookieを有効/無効にする、はい。
Assaf Lavie、

つまり、JavaScriptの代わりに動的言語を使用すると、Cookieは常にクライアントブラウザに追加されるため、サーバーはありません。
balexandre

回答:


58

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

これは、ブラウザがcookieの設定を許可したことを通知するだけで、どのくらいの期間は通知しないことに注意してください。私のFFでは、サイトが例外リストに明示的に追加されていない限り、すべてのCookieを強制的に「セッション」モードにすることができます。このようなCookieは、サーバーの指定された有効期限に関係なく、FFがシャットダウンすると破棄されます。そして、これは私がFFを常に実行するモードです。


14
stackoverflowを除いて?
Simon_Weaver 2009年

9
いくつかのサイトを除いて、そのうちの1つは確かにSOです。
Lawrence Dol、

43

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


23
問題は、サーバー側でCookieを検出する方法についてです。コードはクライアント側で実行されます。
アダム

2
サーバー側-しかし、彼は彼が使用しているサーバー言語を特定していませんでした!しかし、トリックは同じです... Cookieを記述して、そこにあるかどうかを確認します...ある場合は、Cookieを有効にします。そうでない場合は...無効にします;)
balexandre

14
サーバーで使用している言語は関係ありません。この質問は、HTTPリクエスト/レスポンスに関して回答できます。
Martijn、

7
ブラウザーでCookieが有効になっているかどうかを検出するには、そのJavaScriptコードをブラウザーで実行する必要があります。サーバー側では実行できません。
ローンの侯爵

4
@Adam-OPはサーバー側について尋ねましたが、サイトが完全に機能するためにCookieを有効にする必要があることをユーザーに通知しようとしている場合、クライアント側のCookieテストでこれを実現できます(JavaScriptが有効であると想定)。
Chris

18

直接確認する方法はないと思います。最善の方法は、Cookieに値を保存し、それらを読み取って、Cookieを有効にするかどうかを決定することです。


16

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の存在を確認できます。追加のリダイレクトは必要ありません。


5

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

現在のところ、Cookieサポートの確認はCSRF(Cross-Site Request Forgery)防止と密接に関連しています。

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

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


4

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

navigator.cookieEnabled

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

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


私からの+1。反対票の理由は?これは、JavaScriptでのCookieのブロックを検出するための妥当な方法のようです(私にとってはChromeとIEの両方で機能します)。
ミラノガルディアン

6
反対票は、サーバー側からのサポートを検出する方法について具体的に質問されたためだと思います。これは、クライアント側でサポートをテストするための最良の方法です。
TJヴァントール

3
W3Schoolsは、どうやらHTML / Javascript / CSS / etcの信頼できるソースではないようです。情報。
BryanH 2013年

5
これは、ブラウザがサポートしているかどうかのみをテストします。有効になっているかどうかはテストしません。実質的にすべてのブラウザがサポートしているため、これはほとんど価値がないようです。ごめんなさい。
StuckOnSimpleThings 2013

3

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


多くのウェブサイトがこれを行っています。(サーバー上で)最初の要求でCookieが有効になっているかどうかを判断することはできませんが、短いリダイレクト手順を実装してそれを把握することができます。
トムLianza、2009

2

このコードを確認してください、それはあなたを助けるでしょう。

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

1

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

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


3
良い点ですが、Set-Cookieヘッダーによって同じクライアントからの次のリクエストがそのCookieを伴うかどうかを知る必要があるだけです。永続的であるか、セッションのみであるかは、私にとって重要ではありません。
Alexander Yanovets、2009

1

セッション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なしモードをサポートしてください...


1
ASP.NETを前提としています元の質問はテクノロジーに中立でした
David Moorhouse

1

私は上記の「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

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()
}

0

cookieEnabledプロパティは、指定かどうかをブラウザでクッキーが有効になっていることをブール値を返します。

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

OPは、サーバー側でそれを検出する方法を知りたいと思っていました。
ZiggyTheHamster 2016年

明らかに、アプリケーションに適した方法でその情報をサーバーに戻す必要があります。ブラウザと対話せずにブラウザでCookieが有効になっているかどうかを判断することは不可能であることは明らかです。
スティーブは

-1

有効なcookie(trueまたはfalseを返す)とHtmlタグのnoscriptにはnavigator.CookieEnabledを使用します。ちなみにnavigator.cookieEnabledはjavascriptなので、HTMLとして入力しないでください


1
問題は、クライアント側ではなくサーバー側のチェックに関するものです。
Evan M

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.