95

How can I detect on the server (server-side) whether cookies in the browser are disabled? Is it possible?

Detailed explanation: I am processing an HTTP request on the server. I want to set a cookie via the Set-Cookie header. I need to know at that time whether the cookie will be set by the client browser or my request to set the cookie will be ignored.

4

14 に答える 14

61

Cookieセットを使用してリダイレクト応答を送信します。Cookieの(特別な)リダイレクトされたURLテストを処理する場合-通常の処理にリダイレクトされる場合は、エラー状態にリダイレクトされます。

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

于 2009-02-10T07:54:09.007 に答える
42

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 が有効になっている場合にのみ機能します。

于 2009-02-10T08:11:27.530 に答える
18

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

于 2009-02-10T07:56:36.240 に答える
18

以下の回答はずっと前に書かれたものです。現在、良くも悪くも、さまざまな国の法律により、少なくともユーザーがそのようなメカニズムに同意する機会が得られるまで、必要な場合を除いて 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 からのログイン CSRF の詳細をお読みください。これの副作用は、彼らがログインした瞬間に、その Cookie の存在を確認できることです。追加のリダイレクトは必要ありません。

于 2009-02-26T12:28:36.587 に答える
3

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

于 2009-02-10T07:53:46.230 に答える
2

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

navigator.cookieEnabled

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

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

于 2011-11-08T08:43:18.837 に答える
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());
于 2013-11-13T08:36:57.080 に答える
1

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

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

于 2009-02-10T08:39:57.540 に答える
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>
于 2012-10-02T21:32:18.610 に答える
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 をクライアントに書き込もうとします。これがデフォルトのオプションであることは少し奇妙に思えます。無意味に思えるからです。セッションは、クライアント ブラウザで Cookie が無効になっており、UseDeviceProfile に設定されていると機能しません。 、それなら、AutoDetect を使用して、Cookie を無効にしているクライアントの Cookie レス モードをサポートしてみませんか...

于 2011-10-03T15:01:41.533 に答える
0

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

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>
于 2014-06-06T12:10:07.650 に答える
-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
于 2014-01-19T18:19:38.327 に答える
-3

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

于 2013-02-10T22:41:07.723 に答える