วิธีตรวจสอบฝั่งเซิร์ฟเวอร์ว่าปิดใช้งานคุกกี้หรือไม่


91

ฉันจะตรวจจับบนเซิร์ฟเวอร์ (ฝั่งเซิร์ฟเวอร์) ได้อย่างไรว่าคุกกี้ในเบราว์เซอร์ถูกปิดใช้งานหรือไม่ เป็นไปได้ไหม?

คำอธิบายโดยละเอียด:ฉันกำลังประมวลผลคำขอ HTTP บนเซิร์ฟเวอร์ ฉันต้องการตั้งค่าคุกกี้ผ่านSet-Cookieส่วนหัว ฉันต้องการทราบในเวลานั้นว่าคุกกี้จะถูกกำหนดโดยเบราว์เซอร์ไคลเอนต์หรือคำขอของฉันในการตั้งค่าคุกกี้จะถูกละเว้น


ที่ไหน? ในเบราว์เซอร์ (ฝั่งไคลเอนต์)? หรือในเซิร์ฟเวอร์? (เซิร์ฟเวอร์
ไหน

7
DETECT คุกกี้เปิด / ปิดใช้งานในรหัสฝั่งเซิร์ฟเวอร์ใช่
Assaf Lavie

คุณหมายถึงการใช้ภาษาไดนามิกแทน Javascript คุกกี้จะถูกเพิ่มลงในเบราว์เซอร์ไคลเอนต์เสมอดังนั้น ... ไม่มีเซิร์ฟเวอร์!
balexandre

คำตอบ:


58

ส่งการตอบกลับการเปลี่ยนเส้นทางด้วยชุดคุกกี้ เมื่อประมวลผลการทดสอบ URL ที่เปลี่ยนเส้นทาง (พิเศษ) สำหรับคุกกี้ - หากมีการเปลี่ยนเส้นทางไปยังการประมวลผลปกติมิฉะนั้นจะเปลี่ยนเส้นทางไปยังสถานะข้อผิดพลาด

โปรดทราบว่าสิ่งนี้สามารถบอกคุณได้เฉพาะเบราว์เซอร์ที่อนุญาตให้ตั้งค่าคุกกี้ แต่ไม่สามารถกำหนดระยะเวลาได้ FF ของฉันอนุญาตให้ฉันบังคับให้คุกกี้ทั้งหมดเข้าสู่โหมด "เซสชัน" เว้นแต่ว่าไซต์จะถูกเพิ่มลงในรายการข้อยกเว้นโดยเฉพาะ - คุกกี้ดังกล่าวจะถูกละทิ้งเมื่อ FF ปิดตัวลงโดยไม่คำนึงถึงเซิร์ฟเวอร์ที่ระบุหมดอายุ และนี่คือโหมดที่ฉันเรียกใช้ FF เสมอ


14
ยกเว้น stackoverflow?
Simon_Weaver

9
ยกเว้นไซต์จำนวนหนึ่งซึ่งหนึ่งในนั้นเป็น 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
คำถามเกี่ยวกับวิธีตรวจจับคุกกี้ทางฝั่งเซิร์ฟเวอร์ รหัสของคุณทำงานบนฝั่งไคลเอ็นต์
อดัม

2
ฝั่งเซิร์ฟเวอร์ - แต่เขาไม่ได้ระบุว่าเขาใช้ภาษาเซิร์ฟเวอร์อะไร! แต่เคล็ดลับก็เหมือนกัน ... เขียนคุกกี้และดูว่ามีหรือไม่ ... ถ้าเป็นคุกกี้เปิดใช้งานถ้าไม่ ... ปิดใช้งาน;)
balexandre

14
ไม่สำคัญว่าเขาจะใช้ภาษาอะไรบนเซิร์ฟเวอร์ คำถามนี้สามารถตอบได้ในแง่ของคำขอ / การตอบกลับ HTTP
Martijn

7
โค้ด Javascript ต้องทำงานในเบราว์เซอร์เพื่อตรวจสอบว่าเบราว์เซอร์เปิดใช้งานคุกกี้หรือไม่ ไม่สามารถรันฝั่งเซิร์ฟเวอร์ได้
Marquis of Lorne

4
@Adam - แม้ว่า OP จะถามเกี่ยวกับฝั่งเซิร์ฟเวอร์หากคุณพยายามแจ้งให้ผู้ใช้ทราบว่าไซต์ต้องการให้เปิดใช้งานคุกกี้เพื่อให้ทำงานได้อย่างสมบูรณ์การทดสอบคุกกี้ฝั่งไคลเอ็นต์สามารถทำได้ (สมมติว่าเปิดใช้งาน JavaScript)
คริส

18

ฉันไม่คิดว่าจะมีวิธีตรวจสอบโดยตรง วิธีที่ดีที่สุดคือการจัดเก็บค่าในคุกกี้และพยายามอ่านและตัดสินใจว่าเปิดใช้งานคุกกี้หรือไม่


16

วิธีทั่วไปในการตรวจสอบการรองรับคุกกี้คือการเปลี่ยนเส้นทาง

เป็นความคิดที่ดีที่จะทำก็ต่อเมื่อผู้ใช้พยายามทำสิ่งที่เริ่มเซสชันเช่นการเข้าสู่ระบบหรือเพิ่มบางอย่างลงในรถเข็นของพวกเขา มิฉะนั้นคุณอาจบล็อกการเข้าถึงทั้งไซต์ของคุณสำหรับผู้ใช้หรือบ็อตที่ไม่รองรับคุกกี้ทั้งนี้ขึ้นอยู่กับว่าคุณจัดการอย่างไร

ขั้นแรกเซิร์ฟเวอร์จะตรวจสอบข้อมูลการเข้าสู่ระบบตามปกติ - หากข้อมูลการเข้าสู่ระบบไม่ถูกต้องผู้ใช้จะได้รับคำติชมนั้นตามปกติ หากถูกต้องเซิร์ฟเวอร์จะตอบสนองทันทีด้วยคุกกี้และเปลี่ยนเส้นทางไปยังหน้าที่ออกแบบมาเพื่อตรวจสอบคุกกี้นั้นซึ่งอาจเป็นเพียง URL เดียวกัน แต่มีการตั้งค่าสถานะบางอย่างในสตริงข้อความค้นหา หากหน้าที่สองไม่ได้รับคุกกี้ผู้ใช้จะได้รับข้อความแจ้งว่าไม่สามารถเข้าสู่ระบบได้เนื่องจากคุกกี้ถูกปิดใช้งานบนเบราว์เซอร์ของตน

หากคุณติดตามรูปแบบ Post-Redirect-Get สำหรับแบบฟอร์มเข้าสู่ระบบของคุณอยู่แล้วการตั้งค่านี้และการตรวจสอบคุกกี้จะไม่เพิ่มคำขอเพิ่มเติมใด ๆ - สามารถตั้งค่าคุกกี้ระหว่างการเปลี่ยนเส้นทางที่มีอยู่และตรวจสอบโดยปลายทางที่โหลด หลังจากเปลี่ยนเส้นทาง

เหตุใดฉันจึงทำการทดสอบคุกกี้หลังจากการกระทำที่เริ่มโดยผู้ใช้เท่านั้นนอกเหนือจากการโหลดทุกหน้า ฉันเคยเห็นไซต์ใช้การทดสอบคุกกี้ในทุกๆหน้าโดยไม่ทราบว่าสิ่งนี้จะมีผลกระทบต่อสิ่งต่างๆเช่นเครื่องมือค้นหาที่พยายามรวบรวมข้อมูลไซต์ นั่นคือหากผู้ใช้เปิดใช้งานคุกกี้คุกกี้ทดสอบจะถูกตั้งค่าเพียงครั้งเดียวดังนั้นพวกเขาจะต้องอดทนต่อการเปลี่ยนเส้นทางในหน้าแรกที่พวกเขาร้องขอเท่านั้นและจากนั้นจะไม่มีการเปลี่ยนเส้นทาง อย่างไรก็ตามสำหรับเบราว์เซอร์หรือตัวแทนผู้ใช้อื่น ๆ เช่นเครื่องมือค้นหาที่ไม่ส่งคืนคุกกี้ทุกๆหน้าอาจทำให้เกิดการเปลี่ยนเส้นทาง

อีกวิธีหนึ่งในการตรวจสอบการรองรับคุกกี้คือการใช้ Javascript วิธีนี้ไม่จำเป็นต้องเปลี่ยนเส้นทางคุณสามารถเขียนคุกกี้และอ่านกลับได้ทันทีเพื่อดูว่ามีการจัดเก็บและเรียกข้อมูลแล้วหรือไม่ ข้อเสียคือมันทำงานในสคริปต์บนฝั่งไคลเอ็นต์ - กล่าวคือหากคุณยังต้องการข้อความเกี่ยวกับว่าคุกกี้ได้รับการสนับสนุนเพื่อกลับไปยังเซิร์ฟเวอร์หรือไม่คุณก็ยังต้องจัดระเบียบสิ่งนั้นเช่นการโทร Ajax

สำหรับแอปพลิเคชันของฉันฉันใช้การป้องกันบางอย่างสำหรับการโจมตี 'เข้าสู่ระบบ CSRF' ซึ่งเป็นรูปแบบหนึ่งของการโจมตี CSRF โดยการตั้งค่าคุกกี้ที่มีโทเค็นแบบสุ่มบนหน้าจอเข้าสู่ระบบก่อนที่ผู้ใช้จะเข้าสู่ระบบและตรวจสอบโทเค็นนั้นเมื่อผู้ใช้ส่งการเข้าสู่ระบบ รายละเอียด. อ่านเพิ่มเติมเกี่ยวกับการเข้าสู่ระบบ CSRF จาก Google ผลข้างเคียงคือเมื่อพวกเขาเข้าสู่ระบบฉันสามารถตรวจสอบการมีอยู่ของคุกกี้นั้นได้ - ไม่จำเป็นต้องเปลี่ยนเส้นทางเพิ่มเติม


5

โดยปกติคุณอาจต้องตรวจสอบการรองรับคุกกี้หลังจากที่ผู้ใช้ดำเนินการบางอย่างกับไซต์แล้วเช่นการส่งแบบฟอร์มการเข้าสู่ระบบการเพิ่มสินค้าลงในรถเข็นเป็นต้น

สำหรับฉันในขณะนี้การตรวจสอบการรองรับคุกกี้จะควบคู่ไปกับการป้องกัน CSRF (Cross-Site Request Forgery)

คุณควรไปที่อื่นเพื่ออ่านเพิ่มเติมเกี่ยวกับ CSRFแต่แนวคิดเบื้องหลังคือไซต์อื่น ๆ อาจหลอกล่อหรือผู้ใช้ของคุณให้ส่งรูปแบบที่ซ่อนอยู่ในการเลือกไปยังไซต์ของคุณเอง วิธีแก้ปัญหานี้คือการตั้งค่าคุกกี้เมื่อผู้ดูเห็นฟอร์มและตั้งค่าโทเค็นที่ตรงกันเป็นองค์ประกอบฟอร์มที่ซ่อนอยู่จากนั้นเมื่อประมวลผลแบบฟอร์มให้ตรวจสอบว่าทั้งคุกกี้และองค์ประกอบฟอร์มที่ซ่อนอยู่ได้รับการตั้งค่าและจับคู่กัน หากเป็นการพยายามโจมตี CSRF ไซต์จะไม่สามารถระบุฟิลด์ที่ซ่อนไว้เพื่อให้ตรงกับคุกกี้ของผู้ใช้เนื่องจากคุกกี้ของผู้ใช้จะไม่สามารถอ่านได้ภายใต้นโยบายแหล่งกำเนิดเดียวกัน

หากส่งแบบฟอร์มโดยไม่มีคุกกี้ แต่มีโทเค็นที่ดูถูกต้องคุณสามารถสรุปได้ว่าผู้ใช้ปิดการใช้งานคุกกี้และแสดงข้อความที่ระบุว่าผู้ใช้ควรเปิดใช้งานคุกกี้และลองใหม่อีกครั้ง แน่นอนความเป็นไปได้อื่น ๆ คือผู้ใช้ตกเป็นเหยื่อของการพยายามโจมตี CSRF ดังนั้นการบล็อกผู้ใช้เมื่อคุกกี้ไม่ตรงกันก็จะมีผลข้างเคียงในการป้องกันการโจมตีนั้นด้วย


4

ฉันมักจะใช้สิ่งนี้:

navigator.cookieEnabled

อ้างอิงจากw3schools "คุณสมบัติ cookieEnabled ได้รับการสนับสนุนในเบราว์เซอร์หลักทั้งหมด"

อย่างไรก็ตามสิ่งนี้ใช้ได้กับฉันเมื่อฉันใช้แบบฟอร์มซึ่งฉันสามารถสั่งให้เบราว์เซอร์ส่งข้อมูลเพิ่มเติมได้


+1 จากฉัน เหตุผลใดในการโหวตดาวน์? นี่เป็นวิธีที่สมเหตุสมผลในการตรวจจับการบล็อกคุกกี้ใน JavaScript (และใช้ได้ทั้งใน Chrome และ IE สำหรับฉัน)
Milan Gardian

6
ฉันเชื่อว่าคะแนนโหวตลดลงเป็นเพราะคำถามที่ถามโดยเฉพาะเกี่ยวกับวิธีตรวจหาการสนับสนุนจากฝั่งเซิร์ฟเวอร์ นี่เป็นวิธีที่ดีที่สุดในการทดสอบการสนับสนุนในฝั่งไคลเอ็นต์
TJ VanToll

3
เห็นได้ชัดว่า W3Schools ไม่ใช่แหล่งที่น่าเชื่อถือสำหรับ HTML / Javascript / CSS / etc ข้อมูล.
BryanH

5
สิ่งนี้จะทดสอบเฉพาะว่าเบราว์เซอร์รองรับหรือไม่ ไม่ได้ทดสอบว่าเปิดใช้งานอยู่หรือไม่ แทบทุกเบราว์เซอร์รองรับดังนั้นสิ่งนี้จึงดูไร้ค่ามาก ขออภัย.
StuckOnSimpleThings

3

ลองเก็บบางอย่างลงในคุกกี้แล้วอ่าน หากคุณไม่ได้รับสิ่งที่คุณคาดหวังคุกกี้อาจถูกปิดใช้งาน


เว็บไซต์จำนวนมากทำเช่นนี้ เป็นไปไม่ได้ (บนเซิร์ฟเวอร์) ที่จะทราบว่าคุกกี้ถูกเปิดใช้งานในคำขอแรกหรือไม่ แต่คุณสามารถใช้ขั้นตอนการเปลี่ยนเส้นทางสั้น ๆ เพื่อค้นหาได้
Tom Lianza

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

คำถามที่ว่าคุกกี้ "เปิดใช้งาน" เป็นแบบบูลีนเกินไปหรือไม่ เบราว์เซอร์ของฉัน (Opera) มีการตั้งค่าคุกกี้ต่อไซต์ นอกจากนี้การตั้งค่านั้นไม่ใช่ใช่ / ไม่ใช่ รูปแบบที่มีประโยชน์ที่สุดคือ "เซสชันเท่านั้น" โดยไม่สนใจวันหมดอายุของเซิร์ฟเวอร์ หากคุณทดสอบโดยตรงหลังจากการตั้งค่ามันจะอยู่ที่นั่น พรุ่งนี้มันจะไม่

นอกจากนี้ตั้งแต่มันตั้งค่าที่คุณสามารถเปลี่ยนแม้การทดสอบว่าคุกกี้จะยังคงอยู่เพียง แต่บอกคุณเกี่ยวกับการตั้งค่าเมื่อคุณผ่านการทดสอบ ฉันอาจตัดสินใจยอมรับคุกกี้นั้นด้วยตนเอง หากฉันถูกสแปมอยู่เรื่อย ๆ ฉันสามารถ (และในบางครั้ง) ก็จะปิดคุกกี้สำหรับไซต์นั้น


3
จุดดี แต่ฉันแค่ต้องรู้ว่าส่วนหัว Set-Cookie ของฉันจะส่งผลให้คำขอถัดไปจากลูกค้าคนเดียวกันนั้นมาพร้อมกับคุกกี้นั้นหรือไม่ มันไม่สำคัญสำหรับฉันถ้ามันเป็นแบบถาวรหรือเป็นเพียงแค่เซสชันเท่านั้น
Alexander Yanovets

1

หากคุณต้องการตรวจสอบว่าคุกกี้เซสชัน (คุกกี้ที่มีอยู่ตลอดอายุของเซสชัน) ถูกเปิดใช้งานหรือไม่ให้ตั้งค่าโหมดเซสชันของคุณเป็นAutoDetectในไฟล์ web.config ของคุณจากนั้นเฟรมเวิร์ก Asp.Net จะเขียนคุกกี้ไปยังเบราว์เซอร์ไคลเอนต์ เรียกว่าAspxAutoDetectCookieSupport จากนั้นคุณสามารถค้นหาคุกกี้นี้ในคอลเลกชัน Request.Cookies เพื่อตรวจสอบว่าคุกกี้เซสชันถูกเปิดใช้งานบนไคลเอนต์หรือไม่

เช่นในชุดไฟล์ web.config ของคุณ:

<sessionState cookieless="AutoDetect" />

จากนั้นตรวจสอบว่าเปิดใช้งานคุกกี้บนไคลเอนต์ด้วย:

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

Sidenote:โดยค่าเริ่มต้นจะตั้งค่าเป็น UseDeviceProfile ซึ่งจะพยายามเขียนคุกกี้ไปยังไคลเอนต์ตราบเท่าที่ไคลเอนต์สนับสนุนแม้ว่าคุกกี้จะถูกปิดใช้งานก็ตาม ฉันคิดว่ามันแปลกเล็กน้อยที่นี่เป็นตัวเลือกเริ่มต้นเนื่องจากดูเหมือนว่าไม่มีจุดหมาย - เซสชันจะไม่ทำงานกับคุกกี้ที่ปิดใช้งานในเบราว์เซอร์ไคลเอนต์โดยตั้งค่าเป็น UseDeviceProfile และหากคุณสนับสนุนโหมดไม่ใช้คุกกี้สำหรับไคลเอนต์ที่ไม่รองรับคุกกี้ แล้วทำไมไม่ใช้ AutoDetect และรองรับโหมดไร้คุกกี้สำหรับไคลเอนต์ที่ปิดใช้งาน ...


1
สมมติ ASP.NET คำถามเดิมคือเทคโนโลยีเป็นกลาง
David Moorhouse

1

ฉันกำลังใช้คำตอบของ "balexandre" เวอร์ชันที่ง่ายกว่ามากข้างต้น มันพยายามตั้งค่าและอ่านคุกกี้เซสชันเพื่อจุดประสงค์เดียวในการพิจารณาว่าเปิดใช้งานคุกกี้หรือไม่ และใช่สิ่งนี้ต้องการให้เปิดใช้งาน 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 - ฝั่งเซิร์ฟเวอร์ - มิดเดิลแวร์การเปลี่ยนเส้นทางการตรวจสอบคุกกี้ - เซสชันด่วน / ตัวแยกวิเคราะห์คุกกี้

การพึ่งพา

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

แน่นอนคุณจะต้องได้รับข้อมูลนั้นกลับไปที่เซิร์ฟเวอร์ในลักษณะที่เหมาะสมกับแอปพลิเคชันของคุณ ควรชัดเจนว่าไม่สามารถระบุได้ว่าเบราว์เซอร์เปิดใช้งานคุกกี้โดยไม่โต้ตอบกับเบราว์เซอร์หรือไม่
Steve

-1

ใช้ navigator.CookieEnabled สำหรับคุกกี้ที่เปิดใช้งาน (จะคืนค่า true เป็น false) และแท็ก Html noscript navigator.cookieEnabled เป็น javascript ดังนั้นอย่าพิมพ์เป็น HTML


1
คำถามเกี่ยวกับการตรวจสอบฝั่งเซิร์ฟเวอร์ไม่ใช่ฝั่งไคลเอ็นต์
Evan M.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.