Chuyển đến nội dung

Giải mã URL

Chuyển %E2%9C%93 về lại ✓. Chuỗi mã hóa hai lần, mã hóa biểu mẫu và dữ liệu hỏng một nửa đều được xử lý thay vì bị từ chối. Không lưu trữ gì cả.

  • Không bao giờ lưu trữ
  • Không xếp hàng, không phải chờ
  • Không cần đăng ký, không watermark
Đã giải mã

Đã giải mã sẽ hiện ở đây.

Cách hoạt động

1

Dán văn bản đã mã hóa

Cả một URL, một query string, hoặc chỉ một giá trị.

2

Chọn kiểu giải mã nếu cần

Giải mã chuẩn, hoặc giải mã biểu mẫu trong đó + là dấu cách. Nếu không chắc, trang sẽ cho bạn thấy khi hai kiểu cho kết quả khác nhau.

3

Sao chép kết quả

Giải mã lần nữa nếu văn bản bị mã hóa hai lần — chuyện này rất phổ biến, và dễ nhận ra khi bạn đã thấy nó.

Sự mơ hồ không công cụ nào giải quyết thay bạn

Về mặt cơ học, giải mã rất đơn giản — tìm từng dấu % theo sau là hai chữ số hex, đổi lại thành một byte, rồi đọc các byte đó theo UTF-8 — và chỉ có đúng một chỗ thực sự mơ hồ. Dấu cộng có thể là dấu cách, cũng có thể là dấu cộng. Trong biểu mẫu đã gửi, nó là dấu cách, theo một quy ước còn cũ hơn cả đặc tả URL của web. Trong một đoạn đường dẫn, nó là ký tự thật. Bản thân văn bản không cho biết trường hợp nào đúng, nên trang này hiển thị cả hai cách đọc thay vì chọn một và âm thầm sai — điều này quan trọng nhất ở chỗ nó gây hại nhiều nhất: một địa chỉ email hay một giá trị base64, nơi dấu cộng là dữ liệu thật.

Văn bản ngoài ASCII xuất hiện dưới dạng nhiều chuỗi phần trăm cho mỗi ký tự, vì mã hóa làm việc trên byte UTF-8 chứ không phải trên ký tự: một chữ có dấu chiếm hai chuỗi, phần lớn ký hiệu chiếm ba, một emoji chiếm bốn. Giải mã một chuỗi không phải UTF-8 hợp lệ, bạn sẽ nhận được ký tự thay thế — thường là dấu hiệu văn bản đã được mã hóa từ một bảng mã khác, hoặc đã bị cắt cụt giữa chừng một ký tự.

Giải mã hai lần là lỗ hổng bảo mật, không chỉ là một sai sót. Nếu một giá trị được giải mã, kiểm tra, rồi lại giải mã lần nữa, kẻ tấn công có thể giấu ký tự khỏi bước kiểm tra: %252e%252e%252f lọt qua bộ lọc đang tìm “../” vì sau lần giải mã đầu nó vẫn là %2e%2e%2f, và sau lần thứ hai nó chính là kiểu duyệt thư mục mà bộ lọc sinh ra để chặn. Hãy giải mã đúng một lần, rồi mới kiểm tra, và không bao giờ làm theo thứ tự ngược lại.

Văn bản chưa từng được mã hóa sẽ được trả về nguyên vẹn thay vì bị làm hỏng — đây là cách xử lý hữu ích khi bạn không chắc một chuỗi có cần giải mã hay không. Dấu phần trăm không theo sau bởi hai chữ số hex sẽ được giữ nguyên thay vì bị coi là lỗi — đó là dấu phần trăm thật, thường gặp trong văn bản được dán vào chứ không phải được mã hóa.

Khi bạn cần công cụ khác

Trong code, bộ giải mã nên khớp với bộ mã hóa. JavaScript có decodeURIComponent; Python tách unquote khỏi unquote_plus đúng vì câu hỏi dấu cộng; PHP có rawurldecode và urldecode cũng vì lý do đó. Tốt hơn nữa, hãy để một kiểu URL hoặc bộ phân tích query string làm việc này — phần lớn framework đã giải mã tham số cho bạn, và giải mã thêm lần nữa sau đó chính là cách lỗi giải mã hai lần ở trên được viết ra.

Để xem xét một URL dài thay vì giải mã một giá trị, bộ phân tích hữu ích hơn bộ giải mã: python -c "import urllib.parse,sys; print(urllib.parse.urlparse(sys.argv[1]))" tách một địa chỉ thành các phần để bạn thấy phần nào là phần nào trước khi giải mã bất cứ thứ gì — đó thường mới là câu hỏi thực sự khi một đường link hoạt động bất thường.

Câu hỏi thường gặp

Văn bản của tôi vẫn còn %25 sau khi giải mã

Vậy là nó đã bị mã hóa hai lần, chuyện cực kỳ phổ biến — nó xảy ra mỗi khi một giá trị đã mã hóa lại bị mã hóa thêm lần nữa trên đường đi qua một lần chuyển hướng hoặc một lớp ghi log. %25 là dạng mã hóa của chính ký tự %, nên lần giải mã đầu biến %2520 thành %20, và lần thứ hai biến nó thành dấu cách. Chỉ cần giải mã lần nữa. Trang sẽ báo cho bạn khi phát hiện dấu hiệu này.

“+” có nên trở thành dấu cách không?

Tùy vào nguồn gốc của chuỗi, và đó là lý do đây là một lựa chọn chứ không phải phỏng đoán. Trong phần thân application/x-www-form-urlencoded — một biểu mẫu HTML đã gửi — dấu + là dấu cách. Trong một đoạn đường dẫn, hoặc trong dữ liệu chỉ đơn giản đi qua một URL, + là dấu cộng thật và đổi nó thành dấu cách sẽ làm hỏng giá trị. Chuỗi Base64 là trường hợp dễ dính nhất: chúng chứa ký tự + thật, và giải mã kiểu biểu mẫu sẽ phá hỏng chuỗi.

Chuyện gì xảy ra với một chuỗi bị lỗi?

Công cụ giải mã những gì có thể và để nguyên phần còn lại, thay vì từ chối toàn bộ. Một dấu % lạc chỗ không thuộc chuỗi thoát hợp lệ nào — thường gặp khi văn bản đã được giải mã một phần, hoặc bị cắt cụt — khiến bộ giải mã có sẵn của trình duyệt báo lỗi và không trả về gì. Ở đây, mọi chuỗi thoát hợp lệ đều được giải mã và các ký tự lạc được giữ nguyên, hữu ích hơn nhiều khi bạn đang cố đọc một dòng log bị hỏng.

Văn bản của tôi có bị lưu trữ ở đâu không?

Không. Không lưu trữ gì cả và không gửi yêu cầu nào đi. Bạn có thể ngắt kết nối internet sau khi trang tải xong và công cụ vẫn hoạt động.

Tôi có thể giải mã cả một URL cùng lúc không?

Có. Dán toàn bộ vào — cấu trúc được giữ dễ đọc và chỉ những phần đã mã hóa được chuyển về văn bản, nên một URL dài với nhiều tham số đã mã hóa trở thành thứ bạn thực sự đọc được.

Nên biết: Dấu cộng có hai nghĩa: trong query string nó là dấu cách, còn trong đường dẫn nó là dấu cộng thật. Trang này giải mã theo cả hai cách và cho bạn thấy đâu là đâu thay vì đoán. Văn bản chưa từng được percent-encoding sẽ được trả về nguyên vẹn, không bị làm hỏng.

Đặt công cụ này lên website của bạn

Miễn phí cho mọi blog, trang lớp học hay bài viết hướng dẫn. Chỉ cần dán một đoạn mã là khách truy cập có thể dùng ngay trên trang của bạn.