Bagaimana cara mendeteksi sisi server apakah cookie dinonaktifkan


91

Bagaimana cara mendeteksi di server (sisi server) apakah cookie di browser dinonaktifkan? Apa itu mungkin?

Penjelasan mendetail: Saya sedang memproses permintaan HTTP di server. Saya ingin menyetel cookie melalui Set-Cookieheader. Saya perlu mengetahui pada saat itu apakah cookie akan disetel oleh browser klien atau permintaan saya untuk menyetel cookie akan diabaikan.


Dimana? Di browser (sisi klien)? Atau di server? (server mana)
Assaf Lavie

7
DETECT cookie diaktifkan / dinonaktifkan di kode sisi server, ya.
Assaf Lavie

Maksud Anda menggunakan Bahasa Dinamis, bukan Javascript, Cookie selalu ditambahkan ke browser klien, jadi ... tidak ada Server!
balexandre

Jawaban:


58

Kirim tanggapan pengalihan dengan kumpulan cookie; saat memproses pengujian URL yang diarahkan ulang (khusus) untuk cookie - jika ada, alihkan ke pemrosesan normal, jika tidak, alihkan ke status kesalahan.

Perhatikan bahwa ini hanya memberi tahu Anda browser yang mengizinkan cookie disetel, tetapi tidak untuk berapa lama. FF saya memungkinkan saya untuk memaksa semua cookie ke mode "sesi", kecuali situs tersebut secara khusus ditambahkan ke daftar pengecualian - cookie tersebut akan dibuang ketika FF dimatikan terlepas dari kadaluwarsa yang ditentukan server. Dan ini adalah mode saya selalu menjalankan FF.


14
kecuali untuk stackoverflow?
Simon_Weaver

9
Kecuali sejumlah situs, salah satunya memang SO.
Lawrence Dol

43

Anda dapat menggunakan Javascript untuk melakukannya

Perpustakaan:

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;
}

Kode untuk dijalankan:

alert(areCookiesEnabled());

Ingat

Ini hanya berfungsi jika Javascript diaktifkan!


23
Pertanyaannya adalah tentang bagaimana mendeteksi cookie di sisi server. Kode Anda berjalan di sisi klien.
Adam

2
Sisi Server - Tapi dia tidak menentukan bahasa server apa yang dia gunakan! Tetapi triknya sama ... tulis cookie dan lihat apakah cookie itu ada ... jika ada, Cookie Diaktifkan, jika tidak ... Dinonaktifkan;)
balexandre

14
Tidak peduli bahasa apa yang dia gunakan di server. Pertanyaan ini dapat dijawab dalam hal permintaan / tanggapan HTTP.
Martijn

7
Kode Javascript tersebut harus dijalankan di browser untuk mendeteksi apakah browser mengaktifkan cookie. Itu tidak dapat berjalan di sisi server.
Marquis dari Lorne

4
@Adam - meskipun OP bertanya tentang sisi server, jika Anda mencoba memberi tahu pengguna bahwa situs tersebut memerlukan cookie untuk diaktifkan agar berfungsi sepenuhnya, uji cookie sisi klien dapat mencapai ini (dengan asumsi JavaScript diaktifkan).
Chris

18

Saya tidak berpikir ada cara langsung untuk memeriksanya. Cara terbaik adalah dengan menyimpan nilai dalam cookie dan mencoba membacanya dan memutuskan apakah cookie diaktifkan atau tidak.


16

Cara umum untuk memeriksa dukungan cookie adalah melalui pengalihan.

Sebaiknya lakukan ini hanya saat pengguna mencoba melakukan sesuatu yang memulai sesi, seperti masuk, atau menambahkan sesuatu ke keranjang mereka. Jika tidak, bergantung pada cara Anda menanganinya, Anda berpotensi memblokir akses ke seluruh situs Anda untuk pengguna - atau bot - yang tidak mendukung cookie.

Pertama, server memeriksa data login seperti biasa - jika data login salah, pengguna menerima umpan balik itu seperti biasa. Jika benar, maka server segera merespons dengan cookie dan pengalihan ke halaman yang dirancang untuk memeriksa cookie itu - yang mungkin saja URL yang sama tetapi dengan beberapa bendera yang ditambahkan ke string kueri. Jika halaman kedua itu tidak menerima cookie, maka pengguna menerima pesan yang menyatakan bahwa mereka tidak dapat masuk karena cookie dinonaktifkan di browser mereka.

Jika Anda sudah mengikuti pola Post-Redirect-Get untuk form login Anda, maka pengaturan dan pemeriksaan cookie ini tidak menambahkan permintaan tambahan - cookie dapat diatur selama pengalihan yang ada, dan diperiksa oleh tujuan yang memuat setelah pengalihan.

Sekarang mengapa saya hanya melakukan uji cookie setelah tindakan yang dimulai oleh pengguna selain pada setiap pemuatan halaman. Saya telah melihat situs menerapkan uji cookie pada setiap halaman, tidak menyadari bahwa ini akan berdampak pada hal-hal seperti mesin telusur yang mencoba merayapi situs tersebut. Artinya, jika pengguna mengaktifkan cookie, cookie pengujian disetel sekali, jadi mereka hanya perlu menahan pengalihan pada halaman pertama yang mereka minta dan sejak saat itu tidak ada pengalihan. Namun, untuk browser atau agen pengguna lainnya, seperti mesin telusur, yang tidak mengembalikan cookie, setiap halaman dapat dengan mudah menghasilkan pengalihan.

Metode lain untuk memeriksa dukungan cookie adalah dengan Javascript - dengan cara ini, pengalihan tidak diperlukan - Anda dapat menulis cookie dan membacanya kembali secara virtual untuk melihat apakah itu disimpan dan kemudian diambil kembali. Kelemahan dari ini adalah ini berjalan dalam skrip di sisi klien - yaitu jika Anda masih ingin pesan tentang apakah cookie didukung untuk kembali ke server, maka Anda masih harus mengaturnya - seperti dengan panggilan Ajax.

Untuk aplikasi saya sendiri, saya menerapkan beberapa perlindungan untuk serangan 'Login CSRF', varian dari serangan CSRF, dengan menyetel cookie yang berisi token acak di layar login sebelum pengguna login, dan memeriksa token tersebut saat pengguna mengirimkan login mereka detailnya. Baca lebih lanjut tentang Login CSRF dari Google. Efek sampingnya adalah saat mereka masuk, saya dapat memeriksa keberadaan cookie itu - pengalihan tambahan tidak diperlukan.


5

Biasanya, Anda mungkin hanya perlu memeriksa dukungan cookie setelah pengguna melakukan beberapa tindakan di situs, seperti mengirimkan formulir login, menambahkan item ke keranjang mereka, dan sebagainya.

Bagi saya saat ini, memeriksa dukungan cookie sejalan dengan pencegahan CSRF (Cross-Site Request Forgery).

Anda mungkin harus pergi ke tempat lain untuk membaca lebih lanjut tentang CSRF , tetapi gagasan di baliknya adalah bahwa situs lain dapat menipu atau pengguna Anda untuk mengirimkan bentuk tersembunyi pilihan mereka ke situs Anda sendiri. Cara mengatasinya adalah dengan menyetel cookie saat penonton melihat formulir, dan menyetel token yang cocok sebagai elemen formulir tersembunyi, lalu saat memproses formulir, periksa apakah cookie dan elemen formulir tersembunyi telah disetel dan cocok satu sama lain. Jika ini adalah percobaan serangan CSRF, situs tidak akan dapat menyediakan bidang tersembunyi untuk mencocokkan cookie pengguna, karena cookie pengguna tidak akan dapat dibaca oleh mereka di bawah kebijakan yang sama-asal.

Jika formulir dikirimkan tanpa cookie, tetapi berisi token yang tampak valid, Anda dapat menyimpulkan dari sini bahwa pengguna menonaktifkan cookie dan menampilkan pesan yang menunjukkan bahwa pengguna harus mengaktifkan cookie dan mencoba kembali. Kemungkinan lain, tentu saja, adalah bahwa pengguna tersebut adalah korban dari upaya serangan CSRF. Jadi memblokir pengguna ketika cookie tidak cocok juga akan memiliki efek samping mencegah serangan itu.


4

Saya selalu menggunakan ini:

navigator.cookieEnabled

Menurut w3schools "Properti cookieEnabled didukung di semua browser utama.".

Namun, ini berfungsi untuk saya ketika saya menggunakan formulir, di mana saya dapat menginstruksikan browser untuk mengirimkan informasi tambahan.


+1 dari saya. Ada alasan untuk downvote tersebut? Ini sepertinya cara yang masuk akal untuk mendeteksi pemblokiran cookie di JavaScript (dan berfungsi di Chrome dan IE untuk saya).
Milan Gardian

6
Saya percaya bahwa suara yang turun adalah karena pertanyaan yang secara khusus diajukan tentang bagaimana mendeteksi dukungan dari sisi server. Ini adalah cara terbaik untuk menguji dukungan di sisi klien.
TJ VanToll

3
W3Schools tampaknya bukan sumber yang kredibel untuk HTML / Javascript / CSS / dll. informasi.
BryanH

5
Ini hanya menguji jika browser mendukungnya. Itu tidak menguji apakah itu diaktifkan. Hampir setiap browser mendukungnya, jadi ini sepertinya tidak terlalu berguna. Maaf.
StuckOnSimpleThings

3

Cobalah untuk menyimpan sesuatu ke dalam kue, lalu bacalah. Jika Anda tidak mendapatkan apa yang Anda harapkan, cookie mungkin dinonaktifkan.


Banyak situs web melakukan ini. Tidak mungkin (di server) untuk mengetahui apakah cookie diaktifkan pada permintaan pertama , tetapi Anda dapat menerapkan langkah pengalihan singkat untuk mengetahuinya.
Tom Lianza

2

periksa kode ini, itu akan membantu Anda.

<?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

Pertanyaan apakah cookie "diaktifkan" terlalu boolean. Browser saya (Opera) memiliki pengaturan cookie per situs. Lebih jauh, pengaturan itu bukan ya / tidak. Bentuk yang paling berguna sebenarnya adalah "hanya sesi", mengabaikan tanggal kedaluwarsa server. Jika Anda mengujinya langsung setelah pengaturan, itu akan ada di sana. Besok, tidak akan.

Selain itu, karena ini adalah pengaturan yang dapat Anda ubah, bahkan pengujian apakah cookie tetap hanya memberi tahu Anda tentang pengaturan saat Anda menguji . Saya mungkin telah memutuskan untuk menerima satu cookie itu, secara manual. Jika saya terus menerima spam, saya dapat (dan terkadang, akan) mematikan cookie untuk situs itu.


3
Poin bagus, tapi saya hanya perlu tahu apakah header Set-Cookie saya akan menghasilkan permintaan berikutnya dari klien yang sama akan datang dengan cookie itu atau tidak. Tidak penting bagi saya jika itu permanen atau hanya sesi saja.
Alexander Yanovets

1

Jika Anda hanya ingin memeriksa apakah cookie sesi (cookie yang ada selama sesi tersebut) diaktifkan, setel mode sesi Anda ke AutoDetect di file web.config Anda, maka kerangka Asp.Net akan menulis cookie ke browser klien disebut AspxAutoDetectCookieSupport . Anda kemudian dapat mencari cookie ini di koleksi Request.Cookies untuk memeriksa apakah cookie sesi diaktifkan pada klien.

Misalnya di set file web.config Anda:

<sessionState cookieless="AutoDetect" />

Kemudian periksa apakah cookie diaktifkan pada klien dengan:

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

Catatan kecil: Secara default, ini disetel ke UseDeviceProfile, yang akan mencoba menulis cookie ke klien selama klien mendukungnya , meskipun cookie dinonaktifkan. Saya merasa agak aneh bahwa ini adalah opsi default karena tampaknya tidak ada gunanya - sesi tidak akan berfungsi dengan cookie yang dinonaktifkan di browser klien dengan itu disetel ke UseDeviceProfile, dan jika Anda mendukung mode tanpa cookie untuk klien yang tidak mendukung cookie , lalu mengapa tidak menggunakan Deteksi Otomatis dan mendukung mode tanpa cookie untuk klien yang menonaktifkannya ...


1
Asumsikan ASP.NET Pertanyaan asli adalah teknologi netral
David Moorhouse

1

Saya menggunakan versi jawaban "balexandre" yang jauh lebih sederhana di atas. Ini mencoba untuk mengatur, dan membaca cookie sesi untuk tujuan menentukan apakah cookie diaktifkan. Dan ya, ini mengharuskan JavaScript diaktifkan juga. Jadi, Anda mungkin ingin tag di sana jika Anda ingin memilikinya.

<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 - Sisi Server - Cookie Check Redirect Middleware - Express Session / Cookie Parser

Dependensi

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

Middleware

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

The cookieEnabledproperti mengembalikan nilai Boolean yang menentukan apakah atau tidak cookie diaktifkan di browser

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

OP ingin tahu cara mendeteksinya di sisi server.
ZiggyTheHamster

Jelas, Anda harus mendapatkan info itu kembali ke server dengan cara yang sesuai untuk aplikasi Anda. Harus jelas bahwa tidak mungkin untuk menentukan apakah browser mengaktifkan cookie tanpa berinteraksi dengan browser.
Steve

-1

Gunakan navigator.CookieEnabled untuk cookie diaktifkan (ini akan mengembalikan true dari false) dan noscript tag Html. Omong-omong navigator.cookieEnabled adalah javascript jadi jangan mengetiknya sebagai HTML


1
Pertanyaannya adalah tentang pemeriksaan sisi server, bukan sisi klien.
Evan M

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.