Phá vỡ thế hệ câu đố Pro Nerdle (rõ ràng là chúng được mã hóa)

Mar 22 2022
Tôi phải thú nhận rằng, tôi chưa bao giờ nghĩ mình thuộc loại đó, nhưng có điều gì đó khiến tôi hài lòng khi tìm ra những câu đố Wordle ngu ngốc và những thứ tương tự. Sedordle là một thử thách rưỡi, và Squabble là siêu cạnh tranh.

Tôi phải thú nhận rằng, tôi chưa bao giờ nghĩ mình thuộc loại đó, nhưng có điều gì đó khiến tôi hài lòng khi tìm ra những câu đố Wordle ngu ngốc và những thứ tương tự. Sedordle là một thử thách rưỡi, và Squabble là siêu cạnh tranh. Tôi nghĩ tất cả chúng đều rất tuyệt. Nhưng Nerdle sẽ luôn có vị trí hàng đầu trong trái tim tôi.

Nếu bạn chưa biết, thì Nerdle là một biến thể trên Wordle với mục đích là đoán một phương trình toán học và các phỏng đoán của bạn cũng phải chính xác về mặt toán học. Bạn gái của tôi đã khiến tôi bị cuốn hút, và làm Nerdle cuối cùng đã trở thành một thói quen hàng ngày của chúng tôi.

Cuối cùng, chúng tôi phát hiện ra Nerdle có một chế độ mà bạn có thể tạo câu đố cho người khác. Điều này được gọi là Pro Nerdle:

Giao diện người dùng tạo trò chơi cho Pro Nerdle

Bạn có thể sử dụng tối đa 16 ký tự và chọn từ các toán tử như dấu ngoặc đơn, lũy thừa và thậm chí là giai thừa đáng sợ để tạo ra một câu đố hóc búa đến nhức óc để gửi cho bạn bè (hoặc kẻ thù) mà bạn chọn. Giả sử bạn không vượt quá bất kỳ độ dài nào hoặc các lần kiểm tra đủ điều kiện khác, trang web sẽ tạo cho bạn một liên kết duy nhất. Ví dụ, liên kết sau đây dành cho 2 + 3 = 5. Tôi đã bật các toán tử cộng, trừ, nhân và chia, và cho đối thủ của tôi sáu lần thử đoán câu trả lời:

https://pro.nerdlegame.com/34774e56654f9b55ff436c03ea0d86f9/6/EOCFd

Giờ đây, theo thời gian, khi chúng tôi ngày càng chơi nhiều trò này hơn, tôi thấy mình đang nhìn chằm chằm vào liên kết. Thật không may, tôi làm rất nhiều lập trình web, vì vậy mã hóa thông tin trong một URL không phải là điều gì đó quá mới mẻ đối với tôi. Cách tôi mong đợi để trò chơi hoạt động, trong một hệ thống đơn giản, an toàn, theo một quy trình như thế này:

  1. Người dùng tạo câu đố, nhấp vào Gửi
  2. Câu đố được gửi đến máy chủ phụ trợ
  3. Máy chủ phụ trợ xác thực câu đố và trả về lỗi hoặc lưu trữ câu đố trong cơ sở dữ liệu và trả về khóa cơ sở dữ liệu (ví dụ: mã thông báo, một khối văn bản ngẫu nhiên)
  4. Lỗi hoặc liên kết với khóa được nhúng, được hiển thị cho người dùng
  5. Người dùng gửi liên kết cho người khác
  6. Máy chủ trả về câu đố phù hợp khi tải trang, có thể thông qua yêu cầu API phía máy khách hoặc bằng cách nhúng trực tiếp vào phản hồi. (Hoặc tốt hơn, máy chủ có thể trả về số lượng hàng và lựa chọn toán tử, sau đó máy khách có thể sử dụng mã thông báo để yêu cầu xác thực câu trả lời. Bằng cách này, máy khách sẽ không bao giờ nhìn thấy giải pháp cho đến khi nó được đoán)

Nhưng vấn đề về mẫu thiết kế đó là chỉ mã thông báo cần được nhúng vào URL . Tôi mong đợi sẽ thấy một cái gì đó như thế này:

https://pro.nerdlegame.com/34774e56654f9b55ff436c03ea0d86f9

https://pro.nerdlegame.com/34774e56654f9b55ff436c03ea0d86f9/6/EOCFd

Những suy nghĩ này cứ lởn vởn trong đầu tôi, khi tôi chơi nhiều trò chơi hơn và xem nhiều liên kết hơn:

https://pro.nerdlegame.com/125756cb3eb4338fdaa7f00b460e2728bd3538ee30b4b9b8035e9685b380029a/10/F
https://pro.nerdlegame.com/a78a5c44175a59a8b547242c5cc7c692a1a3e57c3d9055a8c443ae00ad17abf4/10/Fd
https://pro.nerdlegame.com/8ec95017355d9b7309493079ac3299c3/10/Fd
https://pro.nerdlegame.com/570de4378009266286cb93c461e4d474/10/Fd
https://pro.nerdlegame.com/5173d394cc4a681d0599369d2570199e57218d4006e3369307c3dddabbfa4941/10/d
https://pro.nerdlegame.com/b91c8e5fcf9575d4555db7c3da54b491/10/Fd
https://pro.nerdlegame.com/981c057c174014cc99f7e25b9d9c1219/6/Fd
https://pro.nerdlegame.com/981c057c174014cc99f7e25b9d9c1219/6/Fd
https://pro.nerdlegame.com/1fdd2113390df41e7b5f9694d0ccfacdd981f3504e4c5583d7b4ea5c8aeffad3/10/Fd
https://pro.nerdlegame.com/a893730fb683f792ab4b46f0d477612e/10/Fd

  • Dự đoán của tôi về mã thông báo vẫn giữ nguyên ngay từ đầu: đó là một số loại dữ liệu ngẫu nhiên mà máy chủ có thể sử dụng để tra cứu lời giải của câu đố.
  • Mục đích của con số trở nên quá rõ ràng. Đó là số hàng có sẵn để giải câu đố. Bạn chỉ có thể chọn 6 ≤ hàng ≤ 10 thông qua trang web, nhưng bạn thực sự có thể thay đổi số trong URL để cho phép bất kỳ số hàng nào; không có gì xác thực điều này:
  • Tôi xấu xa
  • Tôi nhận ra rằng blurb thực sự được sử dụng để đại diện cho việc lựa chọn các toán tử có sẵn cho bộ giải. Việc thêm hoặc xóa một toán tử sẽ thay đổi văn bản, vì vậy tôi đoán rằng mỗi toán tử tương ứng với một ký tự cụ thể. Ngoài ra, các ký tự trong chuỗi được sử dụng để ẩn các toán tử cụ thể, không hiển thị chúng, vì vậy câu đố đơn giản nhất sẽ có một số ký tự trong chuỗi. Thật thú vị, một lần nữa, lựa chọn này chỉ được xác thực khi câu đố được tạo ra, vì vậy tôi có thể tự do trở thành ác nhân nếu tôi thích:
  • Hy vọng bạn không cần dấu cộng :)
  • 1+2=3:05311e29af2c033bdc81fb0806e0bbc2
  • 1+3=4:34774e56654f9b55ff436c03ea0d86f9
  • 123456789012*0=0:2c22a7bc8a7303f21b9b3b88df0891f1b05e26920a4feb93bb5aff2993362e2b

Tuy nhiên, để điều này được thực hiện, mã hóa cần phải xảy ra ở phía máy khách hoặc phía máy chủ để liên kết được hiển thị cho người dùng. Từ quan điểm bảo mật sẽ không có ý nghĩa gì nếu thực hiện nó ở phía máy khách, vì khóa sẽ phải có sẵn cho máy khách, đánh bại mục đích. Với ý nghĩ này, tôi đã mở tab Mạng và tạo một câu đố, và chắc chắn:

chơi lô tô!

Chơi lô tô! Khi tạo liên kết, trình duyệt đưa ra yêu cầu tới điểm cuối API https://api.nerdlegame.com/encode/encodeSolution,. Chuỗi truy vấn chứa bản rõ và phản hồi chứa bản mã. Nhìn vào yêu cầu, tôi chỉ thấy các tiêu đề bình thường do trình duyệt tạo:

Không có xác thực được cung cấp

vì vậy không có xác thực bổ sung nào được thực hiện.

Cuối cùng, chúng tôi có tất cả thông tin cần thiết để có thể tạo Pro Nerdle của riêng mình, bỏ qua các hạn chế do máy khách thực hiện. Nhưng chỉ vì tò mò và vì tôi không cảm thấy thích việc ép buộc các ký tự cho các toán tử khác nhau, tôi đã đặt điểm ngắt XHR / tìm nạp để kích hoạt trên “mã hóa”, aaa và…

Ồ, nó thậm chí còn không được thu nhỏ hay bất cứ thứ gì…

có JavaScript của ứng dụng khách được sử dụng để xác thực câu đố và tạo liên kết. Nó thực sự được nhúng thẳng vào HTML; Tôi rất tôn trọng nhà phát triển vì đã làm điều này :) Cuộn một chút, tôi có thể thấy logic thực hiện một loạt các xác nhận:

  • Đảm bảo rằng giải pháp chỉ chứa: +, -, *, /, =,., ^, (,),!
  • Đảm bảo rằng giải pháp chỉ có một dấu =
  • Đảm bảo các chữ số sau dấu = đều là số (thú vị là, việc kiểm tra này được chú thích, vì vậy có thể sử dụng các biểu thức sau dấu =)
  • Đảm bảo rằng giải pháp không dài hơn 16 ký tự
  • Đảm bảo rằng giải pháp đánh giá chính xác. Điều này được thực hiện bằng cách sử dụng thư viện bigEval (https://github.com/aviaryan/bigEval.js). Trước khi giải pháp được kiểm tra, tất cả các ký tự số mũ được thay thế bằng **, nhưng chỉ trong phần trước dấu =, vì vậy việc sử dụng số mũ sau dấu = sẽ khiến trình tạo từ chối giải pháp.

(Tôi thực sự không chắc tại sao mã hóa lại cần thiết. Tôi có thể thấy việc giảm yêu cầu spam nếu được ghép nối với CAPTCHA hoặc xác thực phía máy chủ sẽ rất hữu ích, nhưng theo ý kiến ​​của tôi, nó không phục vụ mục đích hữu ích nào ngoài việc tạo một số nhận dạng duy nhất, và dù sao thì điều đó cũng có thể được thực hiện ở phía máy khách. Tuy nhiên, thật tuyệt khi nhìn vào.)

Tôi đã tiếp tục và hoàn thành lại chức năng cốt lõi, (tất nhiên là trừ hầu hết các lần kiểm tra), dưới dạng một tập lệnh Python:

Ứng dụng “Pro Nerdle Generator” của tôi

Tôi đã dán tập lệnh trên GitHub dưới dạng Gist. Hãy thoải mái chơi với nó và quấy rối bạn bè của bạn nhiều như bạn muốn. (Bạn cần Python 3 và mô-đun yêu cầu, ví dụ pip install requests:).

https://gist.github.com/an0ndev/42031e03fef6424550baba83009c70c0

Nếu điều này trở nên phổ biến, tôi cũng sẽ tạo một phiên bản web tiện lợi hơn và dán nó trên các trang GitHub, nhưng hiện tại, tôi sẽ để đó như một bài tập cho người xem :)

Dù sao, tôi hy vọng bạn thích cuộc hành trình và Nerdling hạnh phúc!

(ảnh bìa và câu chuyện cuộc đời tôi)

© Copyright 2021 - 2023 | vngogo.com | All Rights Reserved