Çerezlerin devre dışı bırakılıp bırakılmadığı sunucu tarafında nasıl tespit edilir


91

Tarayıcıdaki çerezlerin devre dışı bırakılıp bırakılmadığını sunucuda (sunucu tarafında) nasıl tespit edebilirim? Mümkün mü?

Ayrıntılı açıklama: Sunucuda bir HTTP isteği işliyorum. Set-CookieBaşlık aracılığıyla bir çerez ayarlamak istiyorum . O sırada çerezin istemci tarayıcısı tarafından mı ayarlanacağını yoksa çerezi ayarlama talebimin mi göz ardı edileceğini bilmem gerekiyor.


Nerede? Tarayıcıda (istemci tarafında)? Veya sunucuda? (hangi sunucu)
Assaf Lavie

7
Sunucu tarafı kodunda etkinleştirilmiş / devre dışı bırakılmış çerezleri DETECT, evet.
Assaf Lavie

Javascript yerine Dinamik Dil kullanmayı kastediyorsunuz, Çerezler her zaman istemci tarayıcısına eklenir, yani ... Sunucu yok!
balexandre

Yanıtlar:


58

Çerez setiyle bir yönlendirme yanıtı gönderin; Çerez için (özel) yeniden yönlendirilmiş URL testini işlerken - varsa normal işlemeye yönlendirme, aksi takdirde bir hata durumuna yönlendirme.

Bunun size yalnızca tarayıcının çerezin ayarlanmasına izin verdiğini söyleyebileceğini, ancak ne kadar süreyle bunu yapamayacağını unutmayın. Benim FF, site özel olarak bir istisna listesine eklenmediği sürece, tüm tanımlama bilgilerini "oturum" moduna zorlamama izin veriyor - bu tür tanımlama bilgileri, sunucu belirtilen süre sonu ne olursa olsun FF kapandığında silinecektir. Ve bu, FF'yi her zaman çalıştırdığım moddur.


14
stackoverflow hariç?
Simon_Weaver

9
Biri gerçekten SO olan birkaç site dışında.
Lawrence Dol

43

Bunu başarmak için Javascript kullanabilirsiniz

Kütüphane:

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

Çalıştırılacak kod:

alert(areCookiesEnabled());

Hatırlamak

Bu yalnızca Javascript etkinse çalışır!


23
Soru, sunucu tarafında çerezlerin nasıl tespit edileceğiyle ilgilidir. Kodunuz istemci tarafında çalışır.
Adam

2
Sunucu Tarafı - Ancak hangi sunucu dilini kullandığını belirtmedi! Ama hile aynıdır ... ... Engelli değilse, Çerezler Etkin, bir çerez yazmak ve eğer o ... var mı diye;)
balexandre

14
Sunucuda hangi dili kullandığı önemli değil. Bu soru, HTTP istekleri / yanıtları açısından yanıtlanabilir.
Martijn

7
Bu Javascript kodunun, tarayıcının çerezleri etkinleştirip etkinleştirmediğini tespit etmek için tarayıcıda çalışması gerekir. Sunucu tarafında çalıştıramaz.
user207421

4
@Adam - OP sunucu tarafı hakkında soru sorsa da, kullanıcıya sitenin tam olarak çalışması için çerezlerin etkinleştirilmesi gerektiğini bildirmeye çalışıyorsanız, istemci tarafı çerez testi bunu başarabilir (JavaScript'in etkin olduğu varsayılarak).
Chris

18

Kontrol etmenin doğrudan yolları olduğunu sanmıyorum. En iyi yol, çerezde bir değer saklamak ve bunları okumaya çalışmak ve çerezlerin etkin olup olmadığına karar vermektir.


16

Çerez desteğini kontrol etmenin yaygın bir yolu yeniden yönlendirmedir.

Bunu yalnızca, kullanıcı oturum açmak veya sepetine bir şey eklemek gibi bir oturumu başlatan bir şey yapmaya çalışırken yapmak iyi bir fikirdir. Aksi takdirde, bunu nasıl ele aldığınıza bağlı olarak, çerezleri desteklemeyen kullanıcıların veya botların sitenizin tamamına erişimini potansiyel olarak engelliyorsunuz.

İlk olarak, sunucu oturum açma verilerini normal şekilde kontrol eder - oturum açma verileri yanlışsa, kullanıcı bu geribildirimi normal şekilde alır. Doğruysa, sunucu hemen bir çerezle yanıt verir ve o çerezi kontrol etmek için tasarlanmış bir sayfaya yönlendirme yapar - bu sadece aynı URL olabilir, ancak sorgu dizesine bir miktar bayrak eklenebilir. Bu ikinci sayfa çerezi almazsa, kullanıcı, tarayıcısında çerezler devre dışı bırakıldığı için oturum açamayacağını belirten bir mesaj alır.

Giriş formunuz için Yönlendirme Sonrası-Alma modelini halihazırda izliyorsanız, çerezin bu ayarı ve kontrol edilmesi herhangi bir ek istek eklemeyecektir - çerez mevcut yönlendirme sırasında ayarlanabilir ve yüklenen hedef tarafından kontrol edilebilir. yönlendirmeden sonra.

Şimdi, neden her sayfa yüklemesi dışında yalnızca kullanıcı tarafından başlatılan bir işlemden sonra bir çerez testi yapıyorum. Sitelerin her sayfada bir çerez testi uyguladığını gördüm, bunun siteyi taramaya çalışan arama motorları gibi şeyler üzerinde etkisi olacağını fark etmedim. Diğer bir deyişle, bir kullanıcı çerezleri etkinleştirdiyse, test çerezi bir kez ayarlanır, bu nedenle yalnızca istediği ilk sayfada bir yönlendirmeye katlanmak zorundadır ve bundan sonra yeniden yönlendirme olmaz. Ancak, herhangi bir tarayıcı veya arama motoru gibi çerezleri döndürmeyen diğer kullanıcı aracıları için her bir sayfa basitçe bir yeniden yönlendirmeyle sonuçlanabilir.

Çerez desteğini kontrol etmenin başka bir yöntemi de Javascript'tir - bu şekilde yeniden yönlendirme gerekmez - bir çerez yazabilir ve saklanıp saklanmadığını görmek için hemen hemen geri okuyabilirsiniz. Bunun dezavantajı, istemci tarafında komut dosyasında çalışmasıdır - yani, sunucuya geri dönmek için tanımlama bilgilerinin desteklenip desteklenmediğine ilişkin mesajı hala istiyorsanız, o zaman bunu bir Ajax çağrısı gibi düzenlemeniz gerekir.

Kendi uygulamam için, kullanıcı oturum açmadan önce oturum açma ekranında rastgele bir belirteç içeren bir çerez ayarlayarak ve kullanıcı oturum açma bilgilerini gönderdiğinde bu belirteci kontrol ederek, CSRF saldırılarının bir çeşidi olan 'Oturum Açma CSRF' saldırıları için bir miktar koruma uyguluyorum. detaylar. Google'ın Giriş CSRF'si hakkında daha fazla bilgi edinin. Bunun bir yan etkisi, oturum açtıkları anda o çerezin varlığını kontrol edebiliyorum - fazladan bir yönlendirme gerekli değildir.


5

Genellikle, kullanıcı sitede bir giriş formu göndermek, sepetine bir öğe eklemek vb. Gibi bazı işlemler yaptıktan sonra çerez desteğini kontrol etmeniz gerekebilir.

Şu anda benim için çerez desteğini kontrol etmek, CSRF (Siteler Arası İstek Sahteciliği) önleme ile birlikte yürüyor.

Muhtemelen CSRF hakkında daha fazla bilgi edinmek için başka bir yere gitmelisiniz , ancak bunun arkasındaki fikir, diğer sitelerin kandırabileceği veya kullanıcılarınızın kendi sitenize seçtikleri gizli bir formu göndermeleridir. Bunu aşmanın yolu, görüntüleyen kişi bir formu gördüğünde bir çerez ayarlamak ve gizli bir form öğesi olarak eşleşen bir simge ayarlamak ve ardından formu işlerken, hem çerezin hem de gizli form öğesinin ayarlandığını ve birbiriyle eşleştiğini kontrol etmektir. Bu bir CSRF saldırısı teşebbüsüyse, site, kullanıcının çereziyle eşleşmesi için gizli alanı sağlayamaz, çünkü kullanıcının çerezi aynı menşeli politika kapsamında onlara okunamayacaktır.

Çerez içermeyen bir form gönderilirse, ancak geçerli görünen bir belirteç içeriyorsa, bundan kullanıcının çerezleri devre dışı bıraktığı sonucuna varabilir ve kullanıcının çerezleri etkinleştirmesi ve yeniden denemesi gerektiğini belirten bir mesaj gönderebilirsiniz. Elbette diğer olasılık, kullanıcının bir CSRF saldırısı girişiminin kurbanı olmasıdır. Dolayısıyla, çerez eşleşmediğinde kullanıcıyı engellemek, aynı zamanda bu saldırıyı önleme yan etkisine de sahip olacaktır.


4

Ben hep bunu kullandım:

navigator.cookieEnabled

Göre W3Schools'da "cookieEnabled mülkiyet tüm büyük tarayıcılarda desteklenir.".

Ancak bu, tarayıcıya ek bilgileri göndermesi için talimat verebileceğim formları kullandığımda işime yarıyor.


Benden +1. Olumsuz oylar için herhangi bir sebep var mı? Bu, JavaScript'teki çerez engellemeyi algılamanın makul bir yolu gibi görünüyor (ve benim için hem Chrome'da hem de IE'de çalışıyor).
Milan Gardian

6
Bence olumsuz oylar, sorunun özellikle sunucu tarafından desteğin nasıl tespit edileceğiyle ilgili sorulmasıydı. İstemci tarafında desteği test etmenin en iyi yolu budur.
TJ VanToll

3
Görünüşe göre W3Schools HTML / Javascript / CSS / vb. İçin güvenilir bir kaynak değil . bilgi.
BryanH

5
Bu, yalnızca tarayıcının destekleyip desteklemediğini test eder. Etkin olup olmadığını test etmez. Pratik olarak her tarayıcı onu destekler, bu yüzden bu oldukça değersiz görünüyor. Afedersiniz.
StuckOnSimpleThings

3

Bir şeyi bir çerezde saklamaya çalışın ve sonra okuyun. Beklediğinizi alamazsanız, muhtemelen çerezler devre dışı bırakılır.


Bunu birçok web sitesi yapıyor. İlk istekte tanımlama bilgilerinin etkinleştirilip etkinleştirilmediğini anlamak (sunucuda) mümkün değildir , ancak bunu anlamak için kısa bir yeniden yönlendirme adımı uygulayabilirsiniz.
Tom Lianza

2

bu kodu kontrol edin, size yardımcı olacaktır.

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

Çerezlerin "etkin" olup olmadığı sorusu çok fazla mantıksaldır. Tarayıcımın (Opera) site başına çerez ayarı vardır. Ayrıca, bu ayar evet / hayır değildir. Aslında en kullanışlı biçim, sunucuların son kullanma tarihini göz ardı eden "yalnızca oturum" biçimidir. Ayarladıktan hemen sonra test ederseniz, orada olacaktır. Yarın olmayacak.

Ayrıca, değiştirebileceğiniz bir ayar olduğu için, tanımlama bilgilerinin kalıp kalmadığını test etmek bile size yalnızca test ettiğiniz ayar hakkında bilgi verir . O çerezi manuel olarak kabul etmeye karar vermiş olabilirim. Spam göndermeye devam edersem, o site için çerezleri kapatabilirim (ve bazen kapatırım).


3
İyi bir nokta, ancak sadece Set-Cookie başlığımın aynı istemcinin bir sonraki talebinin bu çerezle gelip gelmeyeceğini bilmem gerekiyor. Kalıcı mı yoksa sadece seans mı olması benim için önemli değil.
Oleksandr Yanovets

1

Yalnızca oturum tanımlama bilgilerinin (oturumun ömrü boyunca var olan tanımlama bilgileri) etkinleştirilip etkinleştirilmediğini kontrol etmek istiyorsanız , web.config dosyanızda oturum modunuzu Otomatik Algıla olarak ayarlayın , ardından Asp.Net çerçevesi istemci tarayıcısına bir tanımlama bilgisi yazacaktır. AspxAutoDetectCookieSupport olarak adlandırılır . Daha sonra, istemcide oturum tanımlama bilgilerinin etkinleştirilip etkinleştirilmediğini kontrol etmek için bu tanımlama bilgisini Request.Cookies koleksiyonunda arayabilirsiniz.

Örneğin, web.config dosya grubunuzda:

<sessionState cookieless="AutoDetect" />

Ardından, istemcide çerezlerin etkinleştirilip etkinleştirilmediğini kontrol edin:

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

Not: Varsayılan olarak, bu, istemci tarafından desteklendiği sürece , tanımlama bilgileri devre dışı bırakılmış olsa bile , istemciye tanımlama bilgileri yazmaya çalışacak olan UseDeviceProfile olarak ayarlanmıştır . Bunun bir nevi anlamsız göründüğü için varsayılan seçenek olması biraz garip buluyorum - oturumlar, kullanıcı tarayıcısında UseDeviceProfile olarak ayarlanmış çerezler devre dışı bırakıldığında çalışmayacak ve çerezleri desteklemeyen istemciler için çerezsiz modu destekliyorsanız , öyleyse neden AutoDetect'i kullanmıyorsunuz ve devre dışı bırakılmış istemciler için çerezsiz modu desteklemiyorsunuz?


1
ASP.NET'i varsayar. Asıl sorunun teknolojiden bağımsız olduğunu varsayar
David Moorhouse

1

Yukarıdaki "balexandre" yanıtının çok daha basitleştirilmiş bir versiyonunu kullanıyorum. Yalnızca tanımlama bilgilerinin etkinleştirilip etkinleştirilmediğini belirlemek amacıyla bir oturum tanımlama bilgisi ayarlamaya ve okumaya çalışır. Ve evet, bunun için JavaScript'in de etkinleştirilmesi gerekir. Bu yüzden, isterseniz bir etiket isteyebilirsiniz.

<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 - Sunucu Tarafı - Tanımlama Bilgisi Kontrolü Yeniden Yönlendirme Ara Yazılımı - Ekspres Oturum / Tanımlama Bilgisi Ayrıştırıcı

Bağımlılıklar

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

Ara yazılım

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

cookieEnabledMülkiyet belirtir olup olmadığını çerezler tarayıcıda etkin olduğunu bir Boole değeri döndürür

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

OP, sunucu tarafında nasıl tespit edileceğini bilmek istedi.
ZiggyTheHamster

Açıkçası, bu bilgiyi uygulamanıza uygun bir şekilde sunucuya geri götürmeniz gerekecek. Bir tarayıcının, tarayıcıyla etkileşime girmeden çerezleri etkinleştirip etkinleştirmediğini belirlemenin imkansız olduğu açık olmalıdır.
Steve

-1

Çerezlerin etkinleştirilmesi için navigator.CookieEnabled'ı kullanın (true of false döndürür) ve Html etiket noscript'i. Bu arada, navigator.cookieEnabled javascript olduğundan HTML olarak yazmayın


1
Soru, istemci tarafında değil, sunucu tarafında yapılan kontrollerle ilgilidir.
Evan M

-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.