Logo Zephyrnet

Chúng ta không học được gì từ Y2K? Tại sao một số người viết mã vẫn bị mắc kẹt trên các số có hai chữ số?

Ngày:

Nếu bạn sử dụng Mozilla Firefox hoặc bất kỳ trình duyệt nào dựa trên Chromium, đặc biệt là Google Chrome hoặc Microsoft Edge, bạn sẽ biết rằng số phiên bản của các sản phẩm này hiện tương ứng là 97 và 98.

Và nếu bạn đã từng xem trình duyệt của mình User-Agent string, bạn sẽ biết rằng các số phiên bản này, theo mặc định, được truyền đến mọi trang web bạn truy cập, như một loại gợi ý hữu ích để nói, "Hãy xem ai sẽ đến ăn tối."

Trong một thế giới lý tưởng, User-Agent tiêu đề sẽ hoàn toàn thừa, vì các trang web được cho là lơ lửng trên các chi tiết vụn vặt như bạn có hệ điều hành nào, CPU đang chạy trên nền tảng nào, nó hoạt động với bao nhiêu bit, hệ thống đồ họa bạn đang sử dụng và thương hiệu của trình duyệt bạn đã chọn.

Nhưng ở đây trên Planet Earth, một số trang web cần biết những chi tiết này để điều chỉnh hành vi của chúng cho phù hợp và nhiều trang web muốn biết chúng vì…

… Tốt, bởi vì từ dữ liệu như thế này, bạn có thể khai thác thông tin; từ thông tin bạn có thể suy ra kiến ​​thức; và tri thức, như người ta thường nói, là sức mạnh.

Trình duyệt của bạn mang lại điều gì cho bạn?

Nếu bạn chưa bao giờ nhìn thấy tiêu đề trình duyệt của mình trong đời thực, có hai cách dễ dàng để làm như vậy.

Đầu tiên là sử dụng trình duyệt của bạn Những công cụ phát triển (cố gắng Ctrl-Shift-I), mở mạng và sau đó truy cập vào một trang web - nội dung của mỗi yêu cầu HTTP gửi đi, bao gồm các tiêu đề và phản hồi HTTP liên quan của nó, sẽ được ghi lại cho bạn và có thể được kiểm tra khi bạn rảnh rỗi.

Sau khi tải trang, nhấp vào một trong các yêu cầu, chọn Headers và cuộn đến Yêu cầu tiêu đề phần:

Cách thú vị thứ hai là xem từ đầu kia của kết nối bằng cách giả vờ là một máy chủ web.

cài đặt Nmap bộ công cụ từ nmap.org, mở dấu nhắc lệnh (hoặc trình bao, hoặc cửa sổ đầu cuối, nếu bạn thích các thuật ngữ đó) và sử dụng ncat lệnh để lắng nghe các kết nối mạng cục bộ đến, chẳng hạn như trên cổng 7777.

Sau đó đặt URL http://127.0.0.1:7777/ vào thanh địa chỉ của trình duyệt, để trình duyệt của bạn kết nối với thiết bị nghe ncat xử lý, nơi yêu cầu HTTP sẽ được nhận chính xác như đã truyền và do đó, các tiêu đề được in ra trên màn hình theo thứ tự mà chúng đến.

Đây là phiên bản Firefox hiện tại (97.0.1 trên 2022-02-25T16: 00Z) gọi một ncat máy chủ web giả:

$ ncat -vv 127.0.0.1 -l 7777 Ncat: Phiên bản 7.92 (https://nmap.org/ncat) Ncat: Đang nghe trên 127.0.0.1:7777 Ncat: Kết nối từ 127.0.0.1. Ncat: Kết nối từ 127.0.0.1:54810. GET / HTTP / 1.1 Máy chủ: 127.0.0.1:7777 Tác nhân người dùng: Mozilla / 5.0 (X11; Linux x86_64; rv: 97.0) Gecko / 20100101 Firefox / 97.0 Chấp nhận: text / html, application / xhtml + xml, application / xml ; q = 0.9, image / avif, image / webp, * / *; q = 0.8 Chấp nhận-Ngôn ngữ: en-GB, en; q = 0.5 Chấp nhận-Mã hóa: gzip, deflate DNT: 1 Kết nối: giữ nguyên Nâng cấp- Yêu cầu không an toàn: 1 Sec-Fetch-Dest: tài liệu Sec-Fetch-Mode: điều hướng Sec-Fetch-Site: none Sec-Fetch-User:? 1

(Bạn sẽ cần phải đánh Ctrl-C trong ncat cửa sổ để đóng kết nối, nếu không trình duyệt của bạn sẽ ở đó vô thời hạn, chờ một phản hồi HTTP không bao giờ đến.)

Phiên bản hiện tại của Edge, dựa trên Chromium, (ngẫu nhiên, không phải do thiết kế) đi trước, ở 98:

$ ncat -vv 127.0.0.1 -l 7777 Ncat: Phiên bản 7.92 (https://nmap.org/ncat) Ncat: Đang nghe trên 127.0.0.1:7777 Ncat: Kết nối từ 127.0.0.1. Ncat: Kết nối từ 127.0.0.1:54738. GET / HTTP / 1.1 Máy chủ: 127.0.0.1:7777 Kết nối: keep-living sec-ch-ua: "Not A; Brand"; v = "99", "Chromium"; v = "98", "Microsoft Edge" ; v = "98" sec-ch-ua-mobile:? 0 sec-ch-ua-platform: "Linux" Nâng cấp-Không bảo mật-Yêu cầu: 1 Tác nhân người dùng: Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, như Gecko) Chrome / 98.0.4758.102 Safari / 537.36 Edg / 98.0.1108.56 Chấp nhận: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, image / apng, * / * ; q = 0.8, application / sign-exchange; v = b3; q = 0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: điều hướng Sec-Fetch-User:? 1 Sec-Fetch-Dest: document Accept-Encoding : gzip, deflate, br Accept-Language: en-US, en; q = 0.9

Như bạn có thể thấy, có rất nhiều số phiên bản khác nhau và các chi tiết khác mà một máy chủ web quan tâm có thể trích xuất từ ​​các tiêu đề đó: số Mozilla gồm một chữ số (5); số AppleWebKit và Safari gồm ba chữ số (537); các thành phần hai và bốn chữ số trong bộ chỉ định Edg (56, 1108).

Nó có thể khó như thế nào đối với một trang web hiện đại - một trang web có lẽ đủ phức tạp có các menu JavaScript thú vị, các trình bổ sung phân tích và theo dõi của bên thứ ba, hình ảnh có độ phân giải cao và thậm chí có thể là cả nội dung video và âm thanh - để hiểu một cách đơn giản chuỗi văn bản có mẫu văn bản rõ ràng, chẳng hạn như dữ liệu bạn thấy trong User-Agent chuỗi trên?

Đủ khó, rõ ràng là cả cộng đồng Firefox và Chromium đều đang băn khoăn về việc phải làm gì khi các trình duyệt tương ứng của họ đạt đến phiên bản 100 và phần đầu tiên của bất kỳ số phiên bản nhiều phần nào đều chuyển từ hai chữ số sang ba.

Thật đáng ngạc nhiên, mặc dù rất hiếm khi xảy ra, thực sự vẫn có những trang web sẽ bối rối khi quá trình chuyển đổi xảy ra và sẽ gây ra những sai lầm theo kiểu lỗi thiên niên kỷ do không tìm ra được số phiên bản.

Trên thực tế, một số trang web vẫn đang tính sai lịch kiểu Y2K bằng cách “tìm ra” rằng bất kỳ số nào từ 100 trở lên đều “tính toán” dưới 99, hoặc 98, hoặc 97, hoặc có lẽ là bất kỳ số nguyên dương nào khác. 1.

Cho rằng quá trình xử lý tiêu đề được thực hiện trên máy chủ, chúng tôi chỉ có thể đoán xem nó hoạt động như thế nào. Vì vậy, không thể xác định chính xác loại lỗi nào tồn tại trên các máy chủ có loại vấn đề này. Một số máy chủ có thể gọi trình duyệt v100 là "cũ" khi chúng thực sự có nghĩa là "chúng tôi gặp sự cố phân tích cú pháp, vì vậy chúng tôi đang đổ lỗi cho bạn và quay lại trang lỗi mặc định của chúng tôi". Những người khác có thể giải thích chuỗi “100” là 10, nếu họ chỉ cắt phần cuối của chuỗi để giới hạn nó ở hai ký tự thông thường hoặc là 00 nếu họ cắt nó khỏi đầu kia. Hoặc chúng có thể kết thúc bằng 0 như một loại mặc định chưa được khởi tạo, có nghĩa là "chúng tôi đã gặp lỗi nhưng không nhận ra". Bởi vì cả 10 và 97 đều nhỏ hơn rất nhiều so với 98 hoặc XNUMX, do đó, máy chủ có thể giải quyết cho giả định thuận tiện rằng bạn đã không cập nhật trình duyệt của mình trong một thập kỷ, thay vì chấp nhận rằng có thể có lỗi phía máy chủ và đưa ra cho bạn lợi ích của sự nghi ngờ.

Chắc chắn một số sai lầm?

Chúng tôi đã phần lớn bỏ qua vấn đề này, mà Firefox và Chrome cũng như đã thử nghiệm từ năm 2021 bằng cách cung cấp cài đặt thử nghiệm cho người thử nghiệm khiến trình duyệt báo cáo trước thời hạn là phiên bản 100 chính.

Firefox thậm chí còn có cài đặt “khả năng tương thích” đặc biệt (truy cập URL about:compat để xem những thứ này), bắt đầu cho phép khoảng ba tháng, để xây dựng một danh sách các trang web đã biết có thể cần phải nói dối khi phiên bản 100 ra mắt cho mọi người.

Tương tự như vậy, trình duyệt Chromium đã giới thiệu một cờ đặc biệt có tên force-major-version-to-100 (chuyến thăm chromium://flags or edge://flags để tìm thấy nó) để người thử nghiệm có thể thử trước số phiên bản là 100.

Thật vậy, các trình duyệt Chromium thậm chí còn có cờ đặc biệt được gọi là force-minor-version-to-100, do đó, thay vì 98.0.4758.102, như bạn đã thấy ở trên, bạn sẽ nhận được một cái gì đó giống như 98.100.4758.102 (hoặc phiên bản lai hơi kỳ lạ số 98.100.1108.56 trên Edge).

Cờ "phiên bản phụ" đó đã được đặt ở đó đặc biệt để kiểm tra khả năng tồn tại của một thứ ba giải pháp cờ đặc biệt, sẽ có sẵn khi phiên bản 100 ra đời: tùy chọn “chắc chắn chúng tôi không cần thứ gì đó ngớ ngẩn vào năm 2022” được gọi là force-major-version-to-minor:

Chúng tôi đã bật tính năng này để dùng thử. (Nó không được bật theo mặc định.)

Chúng tôi không nghĩ rằng một cuộc tấn công kiểu này sẽ hữu ích hoặc thậm chí là cần thiết, nhưng chúng tôi buộc phải, nếu bạn chấp nhận cách chơi chữ kém, phải khám phá tùy chọn mới này…

… Khi chúng tôi nhận thấy rằng ghi chú phát hành đối với phiên bản dành cho nhà phát triển mới nhất của Microsoft Edge, ra mắt vào đêm qua, đã đề cập cụ thể rằng bản phát hành mới:

Đã bật chính sách quản lý từ Chromium để buộc số phiên bản chính ở vị trí phụ Trong chuỗi tác nhân người dùng, là chính sách tạm thời để cố định số phiên bản chính ở 99 và đặt số phiên bản thực tế ở vị trí phụ, ví dụ như chuyển phiên bản 101.0.0.0 thành 99.101.0.0.

Edge-dev, như phiên bản kênh dành cho nhà phát triển, đã chạy một phiên bản chính trước Edge Beta, phiên bản này chạy trước Edge Stable một phiên bản, đây là thứ mà hầu hết mọi người sử dụng, đặc biệt là trên máy tính doanh nghiệp.

Vì Edge Stable hiện ở mức 98 (xem ở trên), điều đó có nghĩa là Edge-dev đã ở mức 100, như bạn có thể thấy từ ncat tại đây, khi chúng tôi truy cập với phiên bản Edge-dev mới nhất:

$ ncat -vv -l 7777 Ncat: Phiên bản 7.92 (https://nmap.org/ncat) Ncat: Đang nghe ::: 7777 Ncat: Đang nghe trên 0.0.0.0:7777 Ncat: Kết nối từ 127.0.0.1. Ncat: Kết nối từ 127.0.0.1:54746. GET / HTTP / 1.1 Máy chủ: 127.0.0.1:7777 Kết nối: keep-living sec-ch-ua: "Not A; Brand"; v = "99", "Chromium"; v = "100", "Microsoft Edge" ; v = "100" sec-ch-ua-mobile:? 0 sec-ch-ua-platform: "Linux" Nâng cấp-Không bảo mật-Yêu cầu: 1 Tác nhân người dùng: Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, như Gecko) Chrome / 100.0.4867.0 Safari / 537.36 Edg / 100.0.1169.1 Chấp nhận: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, image / apng, * / * ; q = 0.8, application / sign-exchange; v = b3; q = 0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: điều hướng Sec-Fetch-User:? 1 Sec-Fetch-Dest: document Accept-Encoding : gzip, deflate, br Accept-Language: en-US, en; q = 0.9

Nhóm Edge-dev rõ ràng dường như nghĩ rằng vẫn còn đủ nhiều trang web không có Y2K, xin lỗi, v100 đã sẵn sàng cho "kế hoạch dự phòng" của Chromium, như người ta đã biết, nở trở lại vào tháng 2021 năm XNUMX, có thể được coi là quan trọng thay vì chỉ hữu ích:

Điều gì có thể đi sai?

Trang web webcompat.com, được giám sát bởi các tình nguyện viên Mozilla, trong số những người khác, có trang GitHub nơi bạn có thể báo cáo nhiều kiểu không tương thích, bao gồm các lỗi web liên quan đến sự cố V1H.

(Chúng tôi đã đặt tên cho đây là lỗi V1H, sử dụng H để viết tắt cho hecto-, từ các từ Hy Lạp fo 100, như trong hectopascal, hoặc hPa, được sử dụng làm đơn vị tiêu chuẩn cho áp suất khí quyển, hoặc Héc ta, biểu thị diện tích đất 100mx100m, giống với cách mà Y2K sử dụng K cho kilo-, nghĩa là 1000).

Chúng tôi đã cài đặt Edge-dev và thử một trong các trang web được báo cáo gần đây trong danh sách Webcompat V1H, cụ thể là daimler.com, trang này đã chuyển hướng chúng tôi đến trang Mercedes-Benz quyết định rằng phiên bản trình duyệt ba chữ số của chúng tôi đã lỗi thời, thay vì hoàn toàn mới:

Với Edge Stable, hiện ở v98, trang web hoạt động tốt, với chuyển hướng của Mercedes-Benz hiển thị cho chúng tôi một trang để thông báo cho chúng tôi rằng công ty Daimler AG, kể từ đầu tháng này, đã được đổi tên thành Mercedes-Benz Group AG.

Trớ trêu thay, có lẽ, trang daimler.com đã không làm tốt hơn khi chúng tôi kích hoạt tùy chọn force-major-version-to-small, khiến trình duyệt có vẻ là v99 với idenfitier nhỏ là 100, điều này gợi ý rằng ba- số phiên bản nhỏ vượt quá khả năng hiểu của nó.

phải làm gì?

  • Nếu bạn là người dùng web, quá trình chuyển đổi có thể sẽ giống như Y2K: hầu hết các trang web sẽ hoạt động tốt và nhiều trang sẽ không bao giờ có lỗi này như một lỗi tiềm ẩn. Nhưng nếu có vấn đề với các trang web bạn cần truy cập, ít nhất bạn biết rằng có những cách giải quyết được các nhà sản xuất trình duyệt dự đoán để giúp bạn.
  • Nếu bạn là một lập trình viên web, điều này thực sự không phải là một vấn đề đối với bạn. Rốt cuộc, nếu số phiên bản gồm ba chữ số nằm ngoài khả năng của bạn, thì ấn tượng nào mang lại cho khách truy cập của bạn về độ tin cậy của cách bạn có thể xử lý dữ liệu có độ dài thay đổi khác, chẳng hạn như số tiền thanh toán, chi tiết thẻ tín dụng, mã bưu điện và thông tin cá nhân khác?

Vẫn còn vài tuần nữa trước khi công chúng bắt đầu gọi bạn bằng Chrome 100, Edge 100 hoặc Firefox 100, vì vậy hãy kiểm tra các thuộc tính web của riêng bạn trước khi quá muộn.

Bây giờ bạn biết làm thế nào!


tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?