Safari 13+ iframe chặn cookie CORS


9

Safari căn hộ không cho phép bạn đặt cookie trong iframe của các tên miền khác với miền mẹ, các tiêu đề CORS phía máy chủ bị nguyền rủa.

Để làm rõ: người dùng đang ở trên domainA.com. Một iframe cho domainB.com đang mở và cố gắng xác thực người dùng trên domainB.com bên trong iframe. Tiêu đề Set-Cookie được trả về từ máy chủ bên trong iframe domainB.com, với tất cả các tiêu đề bắt buộc, nhưng Safari không gửi lại trong các cuộc gọi tiếp theo.

Một cách giải quyết cũ là thực hiện một biểu mẫu gửi từ iframe và đặt cookie vào phản hồi. Tôi đoán họ thích thực tế là người dùng đã nhấp vào một cái gì đó để gửi biểu mẫu. Bạn sẽ phải thăm dò cookie để xem khi nào phản hồi trở lại, vì các lần gửi biểu mẫu không có cuộc gọi lại, và trong trường hợp cookie httpOnly bạn không thể, nhưng này, nó đã hoạt động! Cho đến khi nó không.

Sau đó, một cách giải quyết gần đây hơn là chuyển hướng người dùng đến miền iframe trong cửa sổ / tab hoàn toàn mới, đặt cookie ngẫu nhiên ở đó và từ thời điểm đó, tên miền phụ đó đã được "tin cậy" trong iframe. Một lần nữa, nó yêu cầu một lần nhấp để mở cửa sổ / tab mới và thậm chí còn có một dấu hiệu trực quan về việc mở tab mới. An ninh nhiều, tiêu chuẩn như vậy.

Và bây giờ, kể từ Safari 13 - Không còn cách giải quyết nữa. Không thiết lập Cookie iframe an toàn hơn 🤬

Bất kỳ lược đồ xác thực nào khác đều không tốt cho chúng tôi (ví dụ: tiêu đề Auth-X). Chúng tôi cần sử dụng cookie bảo mật httpOnly, vì chúng tôi không muốn mã thông báo đó có thể được truy cập bởi phía khách hàng javascript.

Để rõ ràng, mọi thứ hoạt động tuyệt vời trên bất kỳ trình duyệt khác.

WebKit Bugzilla có liên quan

Có ai có bất cứ đề nghị?

Biên tập:

Cảm ơn liên kết @tomschmidt, đó có vẻ là hướng đi đúng đắn. Tôi đã thử sử dụng API truy cập lưu trữ của Apple, nhưng thật không may, mặc dù tôi đảm bảo yêu cầu quyền truy cập trước khi khởi tạo logic đăng nhập của mình với API:

requestStorageAccess = async() => {
    return new Promise(resolve => {
      //@ts-ignore
      document.requestStorageAccess().then(
        function () {
          console.log('Storage access was granted');
          resolve(true);
        },
        function () {
          console.log('Storage access was denied');
          resolve(false);
        }
      );    
    });
  }


const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();

Tuy nhiên, các cookie nhận được trên / phản hồi API đăng nhập sẽ không được gửi trong các cuộc gọi tiếp theo tới API :(


Đảm bảo rằng điều này chỉ được kích hoạt khi tương tác rõ ràng với iframe, như onclick.
tomschmidt

1
Vâng, đó là cách tôi đã làm nó. Kiểm tra sự cố bugzilla trên webkit mà tôi đã liên kết, tôi đoán đây là một lỗi thực sự ở phần cuối của Safari: /
Tom Teman

Vấn đề không phải là cookie không được gửi. Nếu bạn yêu cầu quyền truy cập bộ nhớ, cookie hiện có sẽ được gửi đến máy chủ. Vấn đề là bất kỳ cookie mới nào đều không được lưu trữ, vì vậy chúng không được gửi ở đó.
Matt Cosentino

@MattCosentino yeah, ý tôi là vậy - "cookie nhận được trên / phản hồi API đăng nhập" là những cookie mới được gửi lại trong phản hồi tiêu đề Set-Cookie cho miền iframe, nhưng cuộc gọi tiếp theo từ miền iframe không bao gồm những cái đó cookie trong yêu cầu. Vì vậy, có, đúng hơn khi nói rằng gốc rễ của vấn đề là không có cookie mới nào được lưu trữ trong trình duyệt trong kịch bản này.
Tom Teman

Câu trả lời:


1

Tôi nghĩ rằng tôi có thể đã tìm thấy giải pháp: API truy cập lưu trữ của Apple: https://webkit.org/blog/8124/int sinhing-st Storage-access-api /


Xin chào, cảm ơn vì ý tưởng này, nhưng tôi sợ nó không thực hiện được mẹo này (hãy xem phần chỉnh sửa câu trả lời của tôi)
Tom Teman

1
Tôi cũng gặp vấn đề tương tự với safari 13. Có cách giải quyết nào không?
Niroshana

0

Vì vậy, cách giải quyết vẫn khá hiệu quả, miễn là cửa sổ mới đang lưu trữ cookie mà bạn muốn lưu trữ. Khung nội tuyến vẫn không thể lưu trữ cookie của riêng nó. Trong trường hợp của tôi, tất cả những gì tôi cần là cookie id phiên. Vì vậy, tôi mở một cửa sổ bật lên nhỏ khi người dùng cấp quyền truy cập bộ nhớ. Nó nhận và lưu trữ cookie id phiên, đóng và tải lại iframe. Iframe sau đó có quyền truy cập vào cookie id phiên và gửi nó trong các yêu cầu tiếp theo. Tôi nghĩ rằng đây chỉ là tạm thời, có vẻ như họ sẽ xóa quyền truy cập lưu trữ khỏi cửa sổ bật lên trong tương lai. Có lẽ họ sẽ sửa iframe không thể lưu trữ cookie vào lúc đó.


Matt, tôi đã sử dụng một giải pháp tương tự với cửa sổ bật lên, hoạt động trên máy tính để bàn Safari 13.1, nhưng thử nghiệm trên iPad Safari 13.4 thì không hoạt động. Bạn có thể làm việc này trên iPad không? Thnx
teamdane
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.