2010-02-18 43 views
9

Tôi đang tự hỏi nếu sử dụng mã Javascript sau là đáng tin cậy:Có phải document.cookie đáng tin cậy không?

if (!document.cookie) { 
    alert('Cookies are disabled.'); 
} 

Tôi đã thử nghiệm điều này trong IE, Firefox và Chrome và có vẻ như rằng khi bạn vô hiệu hóa các tập tin cookie, đối tượng document.cookie trở thành không có. Có ai có bất kỳ kinh nghiệm với phương pháp này làm việc/không hoạt động?

Nhiều Cảm ơn
Stephen

bổ sung

Tôi cũng nhận thức rằng phương pháp này cần JavaScript để được kích hoạt trên máy khách. Tôi cũng biết về các giải pháp máy chủ/JavaScript khác. Xin thảo luận về chủ đề.

+1

Có thể không đáng tin cậy - nhưng bạn có thể kết hợp các thử nghiệm 'document.cookie' với' navigator.cookieEnabled'. – initall

+0

Tôi không biết. Câu hỏi, như được diễn đạt, có vẻ rất đáng tin cậy. Khi bạn đánh giá document.cookie (hoặc! Document.cooke) nó có trả về giá trị chính xác không? Vâng. Đây có phải là chỉ báo về việc hệ thống phụ cookie có hoạt động đầy đủ không? Không hẳn. – benc

Trả lời

6

Cách duy nhất đáng tin cậy đối với tôi trong trường hợp này (kiểm tra xem cookie có bị vô hiệu hóa, bạn không phiền về vấn đề javascript và cần giải pháp phía máy khách) hay không , sau đó nhận hàm để đọc lại. Nếu không thể đọc lại cookie thử nghiệm, cookie sẽ bị tắt.

Bạn có thể tự mình thực hiện việc đọc tài liệu đó để đọc tài nguyên tuyệt vời từ quirksmode, sử dụng jQuery plugin hoặc out-of-box solution.

1

Thử đặt giá trị trên máy chủ và đọc nó trên máy khách. Nếu cookie được bật, bạn sẽ có thể đọc cùng một giá trị. Nếu không, chúng bị vô hiệu hóa. Lưu ý rằng trang web có thể đã bật httpOnly.

+0

phát hiện phía máy chủ là cách đáng tin cậy nhất – Dapeng

10

Trong tài liệu XHTML, hoàn toàn không có document.cookie (tối đa Firefox 2 hoặc mãi mãi nếu bạn gửi tài liệu là application/xml). Tôi đã phải học đau đớn, nó có thể được đặt trên document, tuy nhiên:

document.cookie = "foo"; 

Đây là JS hợp lệ, và trình duyệt nhún vai và thiết đặt thuộc tính cookie của biến document. Nhưng ma thuật đặc biệt để biến đổi điều này trong tiêu đề HTTP không được gọi.

Để nói tóm lại: Không, bạn không thể chắc chắn rằng sự vắng mặt của document.cookie luôn giống với cookie bị vô hiệu hóa và ngược lại.

+0

Rõ ràng, nó cũng dựa trên JavaScript đang được bật. Người dùng có thể đã bật cookie, nhưng đã tắt JavaScript. –

+2

@Paul: Câu hỏi ngụ ý JS đang bật hay không? Nếu không, mã cũng không đáng tin cậy nếu máy khách bị tắt. – initall

+0

Tôi không đọc ý nghĩa đó từ câu hỏi. Nó hỏi nếu sử dụng mã JavaScript được đề cập là "đáng tin cậy". JavaScript đang được xem là mối quan tâm thứ cấp, nhưng đó là lý do tại sao tôi thêm điểm này làm nhận xét về những gì tôi nghĩ là câu trả lời hay nhất và đặt từ “Rõ ràng” ngay từ đầu. (Nếu máy tính của khách hàng bị tắt, không quan trọng liệu cookie có được bật hay không. Nếu JavaScript bị tắt, có lẽ nó vẫn còn.) –

0
var gotCookie = (navigator.cookieEnabled) ? true : false; 

if(typeof navigator.cookieEnabled == 'undefined' && !gotCookie) { 
    document.cookie = 'test'; 
    gotCookie  = (document.cookie.indexOf('test') != -1) ? true : false; 
    } 

nếu gotCookie == true, sau đó bạn đã gotCookie :)

lưu ý: khi không có bộ cookie, document.cookie có vẻ là không có sẵn ngay cả khi cookie được bật trong trình duyệt. đó là lý do tại sao chúng tôi thiết lập nó với document.cookie = 'test', sau đó kiểm tra nó trên dòng tiếp theo. tất nhiên, giả định rằng js được kích hoạt.

1

Opera 7.10 sẽ không hiểu document.cookie, vì vậy nó không đáng tin cậy. Hãy thử sử dụng cái này thay vì:

<script type="text/javascript"> 
var cookieEnabled=(navigator.cookieEnabled)? true : false 

//if not IE4+ nor NS6+ 
if (typeof navigator.cookieEnabled=="undefined" && !cookieEnabled){ 
document.cookie="testcookie" 
cookieEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false 
} 

//if (cookieEnabled) //if cookies are enabled on client's browser 
//do whatever 

</script> 

Nó tương thích với hầu hết các trình duyệt và những người này sẽ không làm việc với nó không được sử dụng nữa. Tôi đã thử nghiệm nó với Internet Explorer 8.0, Firefox 3.6, Google Chrome 4.0, Opera 10.10 cả trong HTML và XHTML. Trong khi sử dụng phiên bản HTML với Internet Explorer 8.0, tôi đã phải xác nhận việc thực thi tập lệnh.

Các vấn đề liên quan