2015-07-10 60 views
15

Chúng tôi có một ứng dụng web chạy trên Facebook (tức là chạy trong iFrame ở một tên miền khác). Nếu người dùng Safari có Cookie và Dữ liệu trang web được đặt thành mặc định, "Cho phép từ trang web tôi truy cập", dữ liệu chúng tôi lưu trữ qua localStorage.setItem hoạt động như sessionStorage, nghĩa là không có sẵn ngoài phiên hiện tại của người dùng (tức là sau khi người dùng đóng tab). Nếu chúng tôi thay đổi cài đặt thành "Luôn cho phép", cài đặt này hoạt động tốt như trong Chrome, IE, v.v.Safari localStorage không tiếp tục tồn tại giữa các phiên

Làm thử nghiệm, chúng tôi đã cố gắng điều hướng trình duyệt đến miền của ứng dụng của chúng tôi (https://ourappname.appspot.com) trực tiếp và hoạt động tốt đó. Và sau đó nó thực sự phải là một trang web được truy cập, nhưng khi quay trở lại trò chơi trong Facebook, vấn đề vẫn tồn tại.

Lưu ý rằng cuộc gọi setItem đang thành công, nó chỉ là getItem không trả lại bất cứ điều gì trong một phiên tiếp theo. (Vì vậy, nó không giống như khi người dùng là Duyệt web Riêng tư và chính cuộc gọi setItem không thành công với lỗi Quota đã vượt quá.)

Chúng ta cần làm gì để hỗ trợ Safari để ứng dụng của chúng tôi, chạy trong Facebook, có thể sử dụng localStorage làm dự định nơi dữ liệu sẽ tồn tại giữa các phiên?

+0

Lạ lùng, tôi vừa thử nghiệm trong Safari 8.0.7 (10600.7.12) với "Cho phép từ các trang web tôi truy cập". Tôi thiết lập một khóa localStorage và sau đó đóng trình duyệt (với ⌘ + Q) và khi tôi mở lại trình duyệt và sử dụng localStorage.getItem nó đã có. – daviddoran

+0

@daviddoran cảm ơn. Bạn có đang thử nghiệm một trang web đang chạy trong iFrame có tên miền khác với trang web cấp cao nhất không? Tôi sẽ chỉnh sửa câu hỏi của mình để làm rõ hơn. – leontx

Trả lời

3

Tôi vẫn đang chờ trả lời từ Apple, nhưng thật an toàn khi nói rằng chúng tôi bị kẹt với hành vi này. Vì vậy, câu trả lời của Anubhav là chính xác, nhưng chúng tôi vẫn cần một giải pháp.

Vì vậy, với tư cách là một công việc xung quanh, chúng tôi đã tạo các điểm cuối mới trên máy chủ của chúng tôi để duy trì/khôi phục trạng thái trò chơi. Chúng tôi chỉ sử dụng điều này cho Safari, đối với tất cả các trình duyệt khác, chúng tôi vẫn kiên trì trạng thái trò chơi của chúng tôi trong localStorage.

Có một hình phạt hiệu suất nhỏ cho người dùng. Và một chi phí máy chủ nhẹ. Không phải là một giải pháp gợi cảm, nhưng bây giờ ứng dụng canvas Facebook của chúng tôi hỗ trợ Safari.

+0

Bạn đã từng nghe về điều này chưa? Tôi cũng đã gặp phải vấn đề này. Kịch bản của tôi rất giống nhau (iFrame, v.v.). –

+2

@WesleyWorkman Không có thông tin mới kể từ khi đăng câu trả lời này và nhận xét của tôi. Đây là cách giải quyết của chúng tôi, và đã được sản xuất trong một vài tháng và làm việc ổn. – leontx

7

Đó là lỗi trong Safari hoặc tính năng bảo mật.

Bạn đang truy cập FaceBook chứ không phải trang web của mình. Ứng dụng của bạn nằm trong iframe sẽ vi phạm mô hình bảo mật nếu ứng dụng cho phép bạn đọc bất kỳ dữ liệu nào từ trình duyệt. Hãy suy nghĩ xem trang web của đối thủ cạnh tranh có đọc dữ liệu mà nó đã làm/không được đặt hay không. Điều đó sẽ tạo thành một rò rỉ thông tin.

Safari đang thực hiện tốt công việc của mình trong lĩnh vực đó.

Lý tưởng nhất là trong chế độ "Cho phép từ trang web tôi truy cập", không trình duyệt nào cho phép iframe đặt dữ liệu thành localStorage; ngay cả khi mọi miền đều có hộp cát lưu trữ riêng của họ.

Điều gì khiến tôi lo lắng là tại sao họ thậm chí còn cho phép bạn ghi vào localStorage từ iframe (ở chế độ 'Chỉ cho phép trang web tôi truy cập')? Đó có thể thực sự là một lỗi - một cuộc tấn công giả mạo thông tin cho phép lỗi.

Tôi nghĩ rằng đó là vì ngoại lệ bảo mật đã bị loại bỏ khỏi localStorage trong trường hợp xuất xứ không cùng bên yêu cầu. Vì vậy, Safari có thể thực sự sẽ không ném lỗi nhưng để cho nó âm thầm không (trong một số trường hợp). Đó có thể là lý do tại sao cuộc gọi setItem của bạn thành công.

Tại thời điểm này, với thông tin đã cho, tôi nghi ngờ, thưa bạn, bạn không may mắn vì các lập trình viên Safari theo sau standard đến thư.

+0

cảm ơn câu trả lời chu đáo. Dường như nếu người dùng đã điều hướng trực tiếp đến trang web của chúng tôi thì trang web của chúng tôi sẽ được bật để đọc/ghi localStorage. Phần đó cũng có vẻ như nó có thể là một lỗi? Và câu hỏi chính của tôi là những gì chúng ta cần làm ... cho tôi biết nếu bạn biết cách giải quyết nào. Tôi nghĩ rằng hầu hết các ứng dụng canvas Facebook phải tìm ra một số giải pháp cho vấn đề này? – leontx

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