Cách phát hiện phía máy chủ xem cookie có bị tắt hay không


91

Làm cách nào để tôi có thể phát hiện trên máy chủ (phía máy chủ) liệu cookie trong trình duyệt có bị tắt hay không? Có khả thi không?

Giải thích chi tiết: Tôi đang xử lý một yêu cầu HTTP trên máy chủ. Tôi muốn đặt một cookie thông qua Set-Cookietiêu đề. Tại thời điểm đó, tôi cần biết liệu cookie sẽ được đặt bởi trình duyệt của khách hàng hay yêu cầu đặt cookie của tôi sẽ bị bỏ qua.


Ở đâu? Trong trình duyệt (phía máy khách)? Hay trong máy chủ? (máy chủ nào)
Assaf Lavie 10/02/09

7
DETECT cookie được bật / tắt trong mã phía máy chủ, vâng.
Assaf Lavie

ý bạn là sử dụng Ngôn ngữ động thay vì Javascript, Cookie luôn được thêm vào trình duyệt máy khách, vì vậy ... không có Máy chủ!
balexandre

Câu trả lời:


58

Gửi phản hồi chuyển hướng với tập hợp cookie; khi xử lý kiểm tra URL được chuyển hướng (đặc biệt) cho cookie - nếu nó ở đó chuyển hướng sang xử lý bình thường, nếu không thì chuyển hướng đến trạng thái lỗi.

Lưu ý rằng điều này chỉ có thể cho bạn biết trình duyệt đã cho phép đặt cookie, nhưng không phải trong bao lâu. FF của tôi cho phép tôi buộc tất cả cookie ở chế độ "phiên", trừ khi trang web được thêm cụ thể vào danh sách ngoại lệ - những cookie như vậy sẽ bị loại bỏ khi FF tắt bất kể máy chủ đã hết hạn sử dụng. Và đây là chế độ tôi chạy FF luôn.


14
ngoại trừ stackoverflow?
Simon_Weaver

9
Ngoại trừ một số trang web, một trong số đó thực sự là SO.
Lawrence Dol

43

Bạn có thể sử dụng Javascript để thực hiện điều đó

Thư viện:

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

Mã để chạy:

alert(areCookiesEnabled());

Nhớ lại

Điều này chỉ hoạt động nếu Javascript được bật!


23
Câu hỏi đặt ra là về cách phát hiện cookie ở phía máy chủ. Mã của bạn chạy ở phía máy khách.
Adam

2
Server Side - Nhưng anh ấy không chỉ định ngôn ngữ máy chủ mà anh ấy đang sử dụng! Nhưng các trick là như nhau ... viết một cookie và xem nếu nó ở đó ... nếu nó là, Cookies Enabled, nếu không nói là ... tàn tật;)
balexandre

14
Không quan trọng ngôn ngữ anh ấy đang sử dụng trên máy chủ. Câu hỏi này có thể được trả lời theo yêu cầu / phản hồi HTTP.
Martijn

7
Mã Javascript đó phải chạy trong trình duyệt để phát hiện xem trình duyệt có bật cookie hay không. Nó không thể chạy phía máy chủ.
Marquis of Lorne

4
@Adam - mặc dù OP đã hỏi về phía máy chủ, nếu bạn đang cố gắng thông báo cho người dùng rằng trang web yêu cầu bật cookie để hoạt động đầy đủ, thì kiểm tra cookie phía máy khách có thể đạt được điều này (giả sử JavaScript được bật).
Chris

18

Tôi không nghĩ rằng có những cách trực tiếp để kiểm tra. Cách tốt nhất là lưu trữ một giá trị trong cookie và cố gắng đọc chúng và quyết định xem cookie có được bật hay không.


16

Một cách phổ biến để kiểm tra hỗ trợ cookie là thông qua chuyển hướng.

Bạn chỉ nên thực hiện việc này khi người dùng đang cố gắng làm điều gì đó bắt đầu phiên, chẳng hạn như đăng nhập hoặc thêm thứ gì đó vào giỏ hàng của họ. Nếu không, tùy thuộc vào cách xử lý, bạn có thể chặn quyền truy cập vào toàn bộ trang web của mình đối với những người dùng - hoặc bot - không hỗ trợ cookie.

Đầu tiên, máy chủ kiểm tra dữ liệu đăng nhập như bình thường - nếu dữ liệu đăng nhập sai, người dùng sẽ nhận được phản hồi đó như bình thường. Nếu đúng, thì máy chủ ngay lập tức phản hồi bằng một cookie và chuyển hướng đến một trang được thiết kế để kiểm tra cookie đó - có thể chỉ là cùng một URL nhưng với một số cờ được thêm vào chuỗi truy vấn. Nếu trang thứ hai đó không nhận được cookie, thì người dùng sẽ nhận được thông báo rằng họ không thể đăng nhập vì cookie bị tắt trên trình duyệt của họ.

Nếu bạn đang làm theo mẫu Post-Redirect-Get cho biểu mẫu đăng nhập của mình, thì cài đặt và kiểm tra cookie này không thêm bất kỳ yêu cầu bổ sung nào - cookie có thể được đặt trong quá trình chuyển hướng hiện tại và được kiểm tra bởi đích tải sau khi chuyển hướng.

Bây giờ là lý do tại sao tôi chỉ thực hiện kiểm tra cookie sau một hành động do người dùng thực hiện khác với mỗi lần tải trang. Tôi đã thấy các trang web thực hiện kiểm tra cookie trên từng trang đơn lẻ, không nhận ra rằng điều này sẽ ảnh hưởng đến những thứ như các công cụ tìm kiếm đang cố gắng thu thập dữ liệu trang web. Nghĩa là, nếu người dùng đã bật cookie, thì cookie thử nghiệm được đặt một lần, vì vậy họ chỉ phải chịu một chuyển hướng trên trang đầu tiên họ yêu cầu và từ đó trở đi không có chuyển hướng nào. Tuy nhiên, đối với bất kỳ trình duyệt hoặc tác nhân người dùng nào khác, chẳng hạn như công cụ tìm kiếm, không trả về cookie, mọi trang đơn giản có thể dẫn đến chuyển hướng.

Một phương pháp khác để kiểm tra hỗ trợ cookie là với Javascript - theo cách này, không cần chuyển hướng - bạn có thể viết một cookie và đọc lại nó gần như ngay lập tức để xem nó đã được lưu trữ hay chưa và sau đó được truy xuất. Nhược điểm của điều này là nó chạy trong tập lệnh ở phía máy khách - tức là nếu bạn vẫn muốn thông báo về việc cookie có được hỗ trợ để quay trở lại máy chủ hay không, thì bạn vẫn phải tổ chức điều đó - chẳng hạn như với một cuộc gọi Ajax.

Đối với ứng dụng của riêng tôi, tôi triển khai một số biện pháp bảo vệ đối với các cuộc tấn công 'Đăng nhập CSRF', một biến thể của các cuộc tấn công CSRF, bằng cách đặt cookie chứa mã thông báo ngẫu nhiên trên màn hình đăng nhập trước khi người dùng đăng nhập và kiểm tra mã thông báo đó khi người dùng gửi thông tin đăng nhập của họ chi tiết. Đọc thêm về Đăng nhập CSRF từ Google. Một tác dụng phụ của việc này là ngay khi họ đăng nhập, tôi có thể kiểm tra sự tồn tại của cookie đó - không cần thiết phải chuyển hướng thêm.


5

Thông thường, bạn có thể chỉ cần kiểm tra hỗ trợ cookie sau khi người dùng thực hiện một số hành động trên trang web, chẳng hạn như gửi biểu mẫu đăng nhập, thêm một mặt hàng vào giỏ hàng của họ, v.v.

Đối với tôi hiện tại, việc kiểm tra hỗ trợ cookie đi đôi với ngăn chặn CSRF (Cross-Site Request Forgery).

Bạn có thể nên đến nơi khác để đọc thêm về CSRF , nhưng ý tưởng đằng sau đó là các trang web khác có thể lừa hoặc người dùng của bạn gửi một biểu mẫu ẩn mà họ chọn đến trang web của riêng bạn. Cách giải quyết vấn đề này là đặt cookie khi người xem nhìn thấy biểu mẫu và đặt mã thông báo phù hợp làm phần tử biểu mẫu ẩn, sau đó khi xử lý biểu mẫu, hãy kiểm tra xem cả cookie và phần tử biểu mẫu ẩn đã được đặt và khớp với nhau chưa. Nếu đó là một cuộc tấn công CSRF có chủ đích, trang web sẽ không thể cung cấp trường ẩn để khớp với cookie của người dùng, vì cookie của người dùng sẽ không thể đọc được đối với họ theo chính sách cùng nguồn gốc.

Nếu một biểu mẫu được gửi không có cookie, nhưng nó có chứa một mã thông báo hợp lệ, thì bạn có thể kết luận rằng người dùng đã tắt cookie và đưa ra một thông báo cho biết rằng người dùng nên bật cookie và thử lại. Tất nhiên, khả năng khác là người dùng là nạn nhân của một cuộc tấn công CSRF đã cố gắng. Vì vậy, việc chặn người dùng khi cookie không khớp cũng sẽ có tác dụng phụ là ngăn chặn cuộc tấn công đó.


4

Tôi luôn sử dụng cái này:

navigator.cookieEnabled

Theo w3schools "Thuộc tính cookieEnabled được hỗ trợ trong tất cả các trình duyệt chính.".

Tuy nhiên, điều này phù hợp với tôi khi tôi đang sử dụng biểu mẫu, nơi tôi có thể hướng dẫn trình duyệt gửi thông tin bổ sung.


+1 từ tôi. Bất kỳ lý do cho sự phản đối? Đây có vẻ là một cách hợp lý để phát hiện chặn cookie trong JavaScript (và hoạt động trên cả Chrome và IE đối với tôi).
Milan Gardian

6
Tôi tin rằng số phiếu giảm là do câu hỏi được hỏi cụ thể về cách phát hiện hỗ trợ từ phía máy chủ. Đây là cách tốt nhất để kiểm tra hỗ trợ từ phía khách hàng.
TJ VanToll

3
W3Schools rõ ràng không phải là một nguồn đáng tin cậy cho HTML / Javascript / CSS / etc. thông tin.
BryanH

5
Điều này chỉ kiểm tra nếu trình duyệt hỗ trợ nó. Nó không kiểm tra nếu nó được kích hoạt. Trên thực tế, mọi trình duyệt đều hỗ trợ nó, vì vậy điều này dường như là vô giá trị. Lấy làm tiếc.
StuckOnSimpleThings

3

Cố gắng lưu trữ một cái gì đó vào một cookie, và sau đó đọc nó. Nếu bạn không nhận được những gì bạn mong đợi, thì cookie có thể đã bị vô hiệu hóa.


Rất nhiều trang web làm điều này. Không thể (trên máy chủ) để tìm hiểu xem cookie có được bật trong yêu cầu đầu tiên hay không , nhưng bạn có thể thực hiện một bước chuyển hướng ngắn để tìm ra nó.
Tom Lianza

2

kiểm tra mã này, nó sẽ giúp bạn.

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

Câu hỏi liệu cookie có được "bật" hay không là quá boolean. Trình duyệt của tôi (Opera) có cài đặt cookie cho mỗi trang. Hơn nữa, cài đặt đó không phải là có / không. Hình thức hữu ích nhất trên thực tế là "chỉ phiên", bỏ qua ngày hết hạn của máy chủ. Nếu bạn kiểm tra nó trực tiếp sau khi thiết lập, nó sẽ ở đó. Ngày mai, nó sẽ không.

Ngoài ra, vì đó là cài đặt bạn có thể thay đổi, ngay cả việc kiểm tra xem cookie có còn tồn tại hay không cũng chỉ cho bạn biết về cài đặt khi bạn đã kiểm tra . Tôi có thể đã quyết định chấp nhận một cookie đó, theo cách thủ công. Nếu tôi tiếp tục bị spam, tôi có thể (và đôi khi, sẽ) tắt cookie cho trang web đó.


3
Điểm tốt, nhưng tôi chỉ cần biết liệu tiêu đề Set-Cookie của tôi có dẫn đến yêu cầu tiếp theo từ cùng một khách hàng sẽ đến với cookie đó hay không. Nó không quan trọng đối với tôi nếu nó là vĩnh viễn hay chỉ là phiên.
Alexander Yanovets

1

Nếu bạn chỉ muốn kiểm tra xem cookie phiên (cookie tồn tại trong thời gian tồn tại của phiên) đã được bật hay chưa, hãy đặt chế độ phiên của bạn thành Tự động phát hiện trong tệp web.config của bạn, sau đó khung Asp.Net sẽ ghi cookie vào trình duyệt máy khách được gọi là AspxAutoDetectCookieSupport . Sau đó, bạn có thể tìm cookie này trong bộ sưu tập Request.Cookies để kiểm tra xem cookie phiên có được bật trên máy khách hay không.

Ví dụ: trong tập hợp tệp web.config của bạn:

<sessionState cookieless="AutoDetect" />

Sau đó, kiểm tra xem cookie có được bật trên máy khách hay không bằng:

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

Sidenote: Theo mặc định, điều này được đặt thành UseDeviceProfile, nó sẽ cố gắng ghi cookie vào máy khách miễn là máy khách hỗ trợ chúng, ngay cả khi cookie bị tắt. Tôi thấy hơi kỳ lạ khi đây là tùy chọn mặc định vì nó có vẻ như vô nghĩa - các phiên sẽ không hoạt động với cookie bị tắt trong trình duyệt máy khách với nó được đặt thành UseDeviceProfile và nếu bạn hỗ trợ chế độ cookieless cho các ứng dụng không hỗ trợ cookie , vậy tại sao không sử dụng AutoDetect và hỗ trợ chế độ cookieless cho các máy khách đã tắt chúng ...


1
Giả ASP.NET Câu hỏi ban đầu là công nghệ trung lập
David Moorhouse

1

Tôi đang sử dụng phiên bản đơn giản hơn nhiều của câu trả lời của "balexandre" ở trên. Nó cố gắng thiết lập và đọc cookie phiên với mục đích duy nhất là xác định xem cookie có được bật hay không. Và có, điều này cũng yêu cầu JavaScript được bật. Vì vậy, bạn có thể muốn có một thẻ ở đó nếu bạn muốn có một thẻ.

<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 - Phía máy chủ - Phần mềm trung gian chuyển hướng kiểm tra cookie - Express Session / Cookie Parser

Sự phụ thuộc

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

Phần mềm trung gian

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

Các cookieEnabledtài sản trả về một giá trị Boolean mà xác định có hay không bật cookie trong trình duyệt

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

OP muốn biết cách phát hiện phía máy chủ.
ZiggyTheHamster

Rõ ràng, bạn sẽ phải lấy lại thông tin đó về máy chủ theo cách phù hợp với ứng dụng của mình. Rõ ràng là không thể xác định được trình duyệt có bật cookie hay không nếu không tương tác với trình duyệt.
Steve

-1

Sử dụng Navigator.CookieEnabled cho các cookie được bật (nó sẽ trả về true của false) và noscript của thẻ Html. Nhân tiện, Navigator.cookieEnabled là javascript nên đừng nhập nó dưới dạng HTML


1
Câu hỏi liên quan đến việc kiểm tra phía máy chủ, không phải phía máy khách.
Evan M

-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.