1 điểm bởi GN⁺ 1 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Sau khi đọc bài cấm chuỗi truy vấn của Chris Morgan, Susam Pal đã gỡ tham số truy vấn via= từng được thêm vào Wander Console
  • Wander Console là một web console phân tán, tự host, cho phép khách truy cập các website cá nhân khám phá ngẫu nhiên những trang do cộng đồng đề xuất; hiện có hơn 50 website đang host và đề xuất hơn 1500 trang web
  • Tính năng via= cho phép quản trị viên của website được đề xuất xem nguồn truy cập trong access log, nhưng nó hoạt động bằng cách sửa trực tiếp URL đích, như https://midnight.pub/?via=https://susam.net/wander/
  • Việc gắn chuỗi truy vấn sẽ tạo thành một URL mới, có thể trỏ tới tài nguyên khác hoặc trả về 404, và trên thực tế đã làm hỏng các website như trang phông chữ của int10h.org, nơi chuỗi truy vấn được dùng làm định danh riêng
  • Trình duyệt vốn đã có RefererReferrer-Policy để kiểm soát việc truyền thông tin nguồn truy cập, vì vậy từ Wander Console 0.6.0 trở đi, công cụ này sẽ không thêm chuỗi truy vấn nguồn giới thiệu vào URL của người khác nữa

Bài phê phán chuỗi truy vấn của Chris Morgan là chất xúc tác

  • Sau khi đọc bài cấm chuỗi truy vấn của Chris Morgan, Susam Pal đã gỡ tham số truy vấn via= từng được thêm vào dự án Wander Console của mình
  • Chris Morgan không muốn người khác gắn thông tin theo dõi vào URL của ông, như https://chrismorgan.info/no-query-strings?ref=example.com
  • Nếu cần thông tin nguồn truy cập thì có thể xem header HTTP Referer, còn nếu không có header đó thì nhiều khả năng cũng có lý do chính đáng
  • Trước đây, thông qua phản hồi chi tiết mà Chris Morgan để lại về các quy tắc CSS boilerplate của mình trên Hacker News, Susam Pal đã học được những bài học như giữ gạch chân cho liên kết và giữ màu tím cho các liên kết đã truy cập
  • Từ đó, ông tiếp tục đọc các bài viết và phản hồi liên quan đến web của Chris Morgan, và cũng nêu bình luận gần đây trên Lobsters về thêm ngữ cảnh tác giả vào RSS như một ví dụ hữu ích

Cấu trúc và mục đích của Wander Console

  • Wander Console là một web console nhỏ, phân tán và có thể tự host, giúp khách truy cập website cá nhân khám phá các website và trang thú vị do cộng đồng các nhà vận hành website cá nhân độc lập đề xuất
  • Console của Susam Pal nằm tại susam.net/wander/, và khi nhấn nút Wander, nó sẽ tải một trang web cá nhân ngẫu nhiên do cộng đồng Wander đề xuất
  • Công cụ gồm một tệp HTML triển khai console và một tệp JavaScript để chủ website định nghĩa danh sách các console lân cận cùng danh sách các trang web được đề xuất
  • Chỉ cần sao chép hai tệp này lên web server là có thể chạy bằng một web server thông thường, không cần logic phía máy chủ hay phần mềm phía máy chủ riêng
  • Nó cũng có thể được host trong các môi trường bị giới hạn như Codeberg Pages hay GitHub Pages
  • Khi nhấn nút Wander, console sẽ kết nối tới các console từ xa khác, lấy danh sách đề xuất trang web, chọn ngẫu nhiên một mục rồi tải nó trong trình duyệt
  • Nó có phần giống StumbleUpon đã biến mất, nhưng khác ở chỗ hoàn toàn phân tán
  • Nó cũng hơi giống webring, nhưng mạng lưới cộng đồng không bị giới hạn trong cấu trúc vòng lặp mà có thể là đồ thị ở bất kỳ dạng nào
  • Hiện có hơn 50 website đang host công cụ này và tổng cộng đề xuất hơn 1500 trang web
  • Có thể xem snapshot gần đây của các console đã biết và các trang được đề xuất tại susam.codeberg.page/wcn/
  • Để tìm hiểu thêm về công cụ hoặc thiết lập nó cho website của mình, hãy xem codeberg.org/susam/wander

Tham số truy vấn via= như một tính năng sai lầm

  • Wander Console 0.4.0 đã thêm tính năng gắn tham số truy vấn via= khi tải trang web
  • Ví dụ, nếu gặp midnight.pub từ console susam.net/wander/ thì trang sẽ được tải bằng URL sau
https://midnight.pub/?via=https://susam.net/wander/
  • Cách này cho phép quản trị viên website được đề xuất xác nhận trong access log rằng lượt truy cập đến từ Wander Console
  • Tính năng này được thêm vào sau khi thấy yêu cầu tính năng trên Codeberg, nhưng ban đầu vẫn có sự do dự
  • Khi đó, hạn chót cho nghiên cứu về lý thuyết đồ thị đại số đang đến gần, và phần lớn Wander Console cũng được tạo ra trong những quãng nghỉ ngắn khi đang nghiên cứu
  • Phiên bản đầu tiên của console được tạo ra trong khoảng 1 giờ 30 phút vào một buổi sáng sớm, và tính năng via= cũng được triển khai trong một quãng nghỉ ngắn tương tự
  • Susam Pal thích cách duy trì dự án bằng việc giới hạn phạm vi, và khi đã đáp ứng yêu cầu thiết yếu thì để tính năng ở trạng thái hoàn chỉnh, thay vì liên tục bổ sung vào một dự án sở thích nhỏ
  • Dù vậy, ông cho rằng vì mệt mỏi và cường độ công việc nghiên cứu cao nên mình đã không thể bỏ qua yêu cầu tính năng đó
  • Tính năng via= có kèm một tùy chọn để tắt, nhưng về sau ông cũng xem đó là một sai lầm
  • Nếu một tính năng còn đáng ngờ thì ngay cả khi triển khai, nó cũng nên theo cơ chế bật rõ ràng chứ không phải mặc định bật rồi cho phép tắt
  • Câu nói trong Jurassic Park rằng “quá mải mê xem có thể làm được hay không mà không nghĩ xem có nên làm hay không” có vẻ rất hợp với tình huống này

Chuỗi truy vấn thực sự làm hỏng URL

  • Sau khi triển khai tính năng via=, một trang trên website mà ông yêu thích đã không thể tải được trong console
  • Các URL tương tự nhưng hơi khác nhau của trang gặp vấn đề là:
  • URL thứ nhất và thứ hai tải bình thường, nhưng URL thứ ba trả về trang lỗi HTTP 404
  • Website đó dùng chuỗi truy vấn để quyết định sẽ hiển thị bộ sưu tập phông chữ nào trong số nhiều bộ sưu tập
  • Nếu gắn một chuỗi truy vấn tùy ý, website sẽ cố diễn giải nó như định danh của bộ sưu tập phông chữ, nên việc tải trang thất bại
  • Khi Wander Console gắn tham số truy vấn via= vào URL đầu tiên, trang cũng bị hỏng vì cùng lý do đó
  • Khi thay đổi URL, ngay cả việc thêm một chuỗi truy vấn tưởng như nhỏ cũng tạo thành một URL mới
  • URL mới đó có thể trỏ tới một tài nguyên hoàn toàn khác, hoặc không trỏ tới tài nguyên nào cả
  • Susam Pal kết luận rằng bằng việc gắn chuỗi truy vấn via=, ông đã làm hỏng URL hợp lệ của một website mà mình yêu thích

Vấn đề vượt qua Referer và Referrer-Policy

  • Trình duyệt web vốn đã có header HTTP Referer để mang thông tin nguồn truy cập
  • Header này được kiểm soát bởi Referrer-Policy
  • Referrer-Policy có thể được thiết lập ở cấp máy chủ, cấp tài liệu hoặc cấp liên kết riêng lẻ
  • Các tiêu chuẩn web đã cung cấp sẵn một cơ chế kiểm soát có chủ đích để quyết định sẽ gửi phạm vi thông tin nguồn truy cập nào
  • Cách thêm chuỗi truy vấn nguồn giới thiệu vào URL là đang lách qua các cơ chế kiểm soát đó
  • Điều này đồng nghĩa với việc kéo vấn đề quyền riêng tư và ghi nhận nguồn truy cập ra khỏi cơ chế referrer rồi nhét trực tiếp vào URL đích
  • Ông kết luận rằng các công cụ HTML không nên sửa URL theo cách như vậy
  • Ông cũng cho rằng việc tự ý sửa URL thay người dùng để chèn chuỗi truy vấn nguồn giới thiệu vốn dĩ đã không đúng

Gỡ bỏ tính năng và nguyên tắc về sau

  • Tính năng chuỗi truy vấn nguồn giới thiệu đã bị gỡ khỏi Wander Console
  • Tính năng này có thể đã được giữ lại dưới dạng tùy chọn bật rõ ràng, nhưng sau khi kết luận rằng đây là một tính năng sai, ông không muốn nó tiếp tục tồn tại trong phần mềm dưới bất kỳ hình thức nào
  • Vì dự án vẫn còn mới và đang ở giai đoạn phát hành 0.x, ông cho rằng đây là thời điểm thích hợp để loại bỏ tính năng
  • Khi bài cấm chuỗi truy vấn của Chris Morgan xuất hiện trong feed reader, ông đã tạm dừng việc nghiên cứu để gỡ tính năng này
  • Có thể xem nội dung gỡ bỏ trong commit b26d77c
  • Bản phát hành mới nhất là 0.6.0 không còn bao gồm tính năng này nữa
  • Từ nay, nếu một dự án sở thích mới cần tải URL, ông sẽ tải nó đúng như ý định ban đầu của tác giả website
  • Ông đi đến kết luận rằng mình sẽ không thêm chuỗi truy vấn vào URL của người khác

1 bình luận

 
Ý kiến trên Lobste.rs
  • Cảm ơn vì đã cho tôi biết bài viết của tôi đã giúp ích như thế nào. Có nhiều lý do khiến tôi viết các bài đánh giá chi tiết: một phần là để tự thỏa mãn, một phần là để giúp dự án gốc, đôi khi là vì nhà phát triển tỏ ra quan tâm, đôi khi thì không, và đôi khi là vì ai đó trên Internet đã sai
    Nhưng lý do lớn nhất là tôi thích dạy, và tôi biết người khác có đọc các bài đánh giá này. Thực tế, các bài đánh giá của tôi thường xuyên nằm trong số những bình luận được upvote nhiều nhất
    Thỉnh thoảng tôi thực sự trân trọng những bình luận cảm ơn từ người lạ, và một lời cảm ơn chi tiết như thế này lại càng khiến tôi thấy ấm lòng hơn
    Điều thú vị là tôi đã phát hiện trang của bạn vào tháng 1 và đặc biệt thích bài “more purple links, please”, nhưng đến hôm nay mới nhận ra rằng hóa ra tôi đã ảnh hưởng đến lập trường của bạn lúc nào không hay
    Hôm qua tôi đã ra mắt một website mới, và từ giờ định sẽ đăng nhiều bài đánh giá hơn nữa trên nhiều kênh khác nhau. Tháng trước tôi có viết sơ qua về kế hoạch này ở đây: https://lobste.rs/s/vpdpkq/llm_reviews_cargo_crev#c_8uk441
    Tôi cũng hơi ngạc nhiên khi đã có thêm một ví dụ nữa về trang phản ứng dị ứng với chuỗi truy vấn bổ sung. Ở trang đó, chỉ riêng trang này dùng chuỗi truy vấn để định tuyến các trang con kiểu ?1, ?2, ?3, ?4, còn các trang khác thì chấp nhận chuỗi truy vấn. Phân trang tuần tự rõ ràng là có tính phân cấp nên đi ngược lại tinh thần của URL, nhưng kiểu như ?page=1 cũng vẫn rất phổ biến
    Khi quyết định nên trả về mã trạng thái nào, tôi lo rằng 404 có thể gây tác dụng phụ vì những giả định sai, nhưng có lẽ nỗi lo đó là hơi quá. Tôi đã quên mất rằng một phần rất lớn của web không dùng đường dẫn theo cách có ý nghĩa

    • Bạn có cân nhắc trả về phản hồi "418 I'm not a teapot" cho các chuỗi truy vấn không được phép không?
  • Hay đấy. Wander console đang phát triển rất tốt, và có vẻ sự tỉ mỉ mà Susam thể hiện ở đây là một phần lớn lý do vì sao nó hoạt động hiệu quả
    Tôi cũng đã thấy vài biến thể gắn thêm chuỗi truy vấn không mong muốn vào URL của mình. Bản tin Programmer Weekly có thêm truy vấn, nhưng lại cũng có cả referer header nên thành ra trùng lặp
    Một trường hợp khác dường như gắn ID riêng cho từng người đăng ký, điều mà tôi hoàn toàn không muốn. Phiền ở chỗ là không có referer nên tôi cũng không biết site nào làm vậy
    /blog/modeling-on-demand-pricing/?ck_subscriber_id=<unique-id>

  • Tôi muốn đồng ý với câu “nếu muốn biết thì cứ xem Referer header, còn nếu không có thì chắc là có lý do của nó”, nhưng Referer nhiều năm nay đã ở trạng thái phần nào bị hỏng hoặc vô dụng. Đó là lý do duy nhất mấy thứ này xuất hiện

    • Ý bạn là sao khi nói vậy?
  • “Tại sao lại thêm vào? Vì tôi đã chiều theo yêu cầu của số đông”, thật vậy sao? Đó chỉ là một bình luận thoáng qua được 5 upvote dưới một issue không liên quan. Có vẻ trận chiến trước khi đầu hàng cũng không căng thẳng lắm ;-)

    • Tôi không rõ “bình luận thoáng qua” ở đây nghĩa là gì. Bình luận đó đến từ một người đã trực tiếp dùng phần mềm của tôi, cài nó lên website của họ, và biến site đó thành một phần của mạng lưới cộng đồng. Tôi sẽ không xem đó là điều “thoáng qua”
      Vào thời điểm dự án này chỉ có khoảng mười người dùng, nếu một đề xuất tính năng mới nhận được 5 upvote thì với tôi nó đúng là yêu cầu từ số đông
      Các dự án của tôi thường chỉ là những công cụ nhỏ làm như sở thích. Ngoại trừ một vài trường hợp, chúng không có nhiều người dùng. Vì vậy khi tôi nhận được yêu cầu tính năng hay báo lỗi, dù ở issue liên quan hay không liên quan, với tôi chúng đều quan trọng. Dù không phải lúc nào tôi cũng xử lý ngay, tôi vẫn ghi nhớ trong đầu yêu cầu nào nhận được nhiều nhu cầu hơn