Bộ phân tích URL/ thanh tra
Dán một hay nhiều địa chỉ URL (một trên mỗi dòng) để phân tích mỗi địa chỉ Mạng, máy, đường dẫn, chuỗi truy vấn, và mảnh, với mỗi tham số truy vấn được giải mã.
Dán một hay nhiều địa chỉ URL (một trên mỗi dòng) để phân tích mỗi địa chỉ Mạng, máy, đường dẫn, chuỗi truy vấn, và mảnh, với mỗi tham số truy vấn được giải mã.
Một địa chỉ URL chỉ có thể chứa chữ cái, chữ số an toàn, và một bộ ký hiệu nhỏ (- _ . ~). Mọi thứ khác, bao gồm không gian, phân loại, và các nhân vật không phải là Anh, phải được đại diện với phân số phần trăm trước khi nó có thể đi vào trong một URL.
Phần trăm thay thế một ký tự với một dấu phần trăm sau đó với giá trị thập lục phân hai chữ số, sử dụng UTF-8 để làm bất cứ điều gì bên ngoài đường cong cơ bản. Một không gian trở thành %20, một ampersand trở thành %26, và một ký tự được nhấn mạnh hoặc không phải Latin có thể trở thành một số dãy %XX trong một hàng, vì UTF-8 thể hiện nó là nhiều hơn một byte.
Các ký tự như? & = # và / có một ý nghĩa đặc biệt trong một cấu trúc URL: chúng đánh dấu chuỗi truy vấn, tham số riêng biệt, hoặc giới thiệu mảnh đó. Nếu dữ liệu của bạn cần chứa một trong những kí tự này như là một giá trị thay vì cấu trúc, mã hóa nó trước, hoặc trình duyệt hay máy phục vụ có thể hiểu sai nơi một phần của địa chỉ URL kết thúc và lần sau bắt đầu.
Giải mã đảo chiều của tiến trình: nó đọc mỗi chuỗi %X X trở lại ký tự (hoặc byte), nó đại diện, đó chính xác là những gì công cụ bên trên làm.
| Ký tự | Đã mã hóa | Nơi nó được dùng |
|---|---|---|
| không gian | %20 | Dấu tách từ bên trong một giá trị |
| ! | %21 | |
| " | %22 | |
| # | %23 | Khởi động các mảnh |
| % | %25 | Bắt đầu chuỗi mã phần trăm |
| & | %26 | Tham số truy vấn riêng |
| ' | %27 | |
| ( | %28 | |
| ) | %29 | |
| + | %2B | Thường xuyên đọc là một khoảng trống bên trong một chuỗi truy vấn |
| , | %2C | |
| / | %2F | Chia đoạn |
| : | %3A | Theo kế hoạch, ví dụ https: |
| ; | %3B | |
| = | %3D | Gán giá trị tham số truy vấn |
| ? | %3F | Chạy chuỗi truy vấn |
| @ | %40 | |
| [ | %5B | |
| ] | %5D |
Một học sinh chép địa chỉ trang web từ một biểu mẫu trực tuyến và thấy trong đó có đoạn chữ kiểu science%20project%20notes. Ở chỗ khác, một người mới học lập trình mở xem một yêu cầu gửi tới API thì phát hiện dấu và nằm trong giá trị tìm kiếm lại hiện ra thành %26. Địa chỉ vẫn chạy, nhưng vừa khó đọc vừa khó dò lỗi.
Công cụ giải mã URL đưa những chuỗi mã hóa bằng dấu phần trăm trở về đúng ký tự mà chúng đại diện. Chẳng hạn %20 thường trở lại thành một khoảng trắng, còn %26 thì thành dấu và.
Giải mã giúp bạn hiểu một đường dẫn, xem xét các tham số truy vấn, học cách web mã hóa dữ liệu và tìm nguyên nhân của những yêu cầu hỏng. Nhưng phải làm cẩn thận, vì các ký tự dành riêng sau khi giải mã có thể làm thay đổi luôn cấu trúc của địa chỉ.
Công cụ này không kết luận nơi đến là an toàn, là đúng hay là được phép. Nó chỉ đổi cách biểu diễn của những ký tự đã mã hóa. Phần máy chủ, đường dẫn, tham số và các giá trị vừa giải ra thì học sinh và người lập trình vẫn phải tự xem lấy.
Địa chỉ web dùng một số ký tự nhất định để tách các phần của nó. Dấu hỏi có thể mở đầu chuỗi truy vấn, dấu và có thể ngăn cách các tham số, còn dấu thăng có thể đánh dấu một phần bên trong trang.
Khi một trong những ký tự ấy phải xuất hiện với tư cách dữ liệu chứ không phải dấu ngăn cách, người ta mã hóa nó bằng dấu phần trăm: sau dấu phần trăm là hai chữ số thập lục phân đại diện cho giá trị của một byte.
| Giá trị đã mã hóa | Ký tự sau khi giải | Ý nghĩa thường gặp |
|---|---|---|
%20 |
Khoảng trắng | Ngăn cách các từ bên trong một giá trị |
%21 |
! |
Dấu chấm than |
%23 |
# |
Dấu thăng hoặc dấu mở phần trong trang |
%26 |
& |
Dấu và hoặc dấu ngăn cách tham số |
%2B |
+ |
Dấu cộng |
%2F |
/ |
Dấu gạch chéo hoặc dấu ngăn cách đường dẫn |
%3A |
: |
Dấu hai chấm |
%3D |
= |
Dấu bằng hoặc dấu ngăn cách tham số |
%3F |
? |
Dấu hỏi hoặc dấu mở truy vấn |
Chữ cái thập lục phân trong các chuỗi phần trăm không phân biệt hoa thường, nên %2F và %2f cùng đại diện cho một byte.
Hãy xem ví dụ này:
https://example.edu/search?q=water%20cycle&level=grade%206#results
Các phần chính của nó gồm:
httpsexample.edu/searchq=water%20cycle&level=grade%206resultsHai giá trị truy vấn giải ra thành “water cycle” và “grade 6”. Đừng lẫn dấu và mang tính cấu trúc, cái ngăn hai tham số với nhau, với một dấu và được mã hóa nằm bên trong một giá trị.
Người lập trình hay tự chuốc lấy rắc rối khi giải mã cả địa chỉ trong lúc đáng ra chỉ cần giải một thành phần. Cùng một ký tự dành riêng, đứng ở mỗi chỗ lại giữ một vai khác.
Giả sử một truy vấn có nội dung:
?topic=research%26writing
Giá trị đã mã hóa ấy đại diện cho:
research&writing
Dấu và ở đây là một phần của giá trị chủ đề. Nếu đem giải cả truy vấn rồi phân tích sai, dấu và ấy dễ bị hiểu nhầm thành dấu ngăn cách mở ra một tham số mới.
Một ứng dụng đáng tin sẽ phân tích địa chỉ theo đúng cấu trúc của nó và giải từng thành phần bằng một giao diện lập trình dành riêng cho URL, chứ không thay chuỗi một cách tùy tiện.
Cả lớp cùng xem:
https://example.edu/library?topic=space%20science
Các em chỉ ra đâu là máy chủ, đâu là đường dẫn, đâu là tên tham số và đâu là giá trị đã mã hóa.
Giá trị space%20science trở thành space science. Học sinh giải thích vì sao người ta thường không viết thẳng một khoảng trắng vào địa chỉ đem chia sẻ cho người khác.
Giáo viên đưa ra ví dụ:
?title=Design%20%26%20Technology
Tiêu đề sau khi giải là Design & Technology. Học sinh nhận ra dấu và đã mã hóa thuộc về tiêu đề chứ không ngăn cách tham số nào cả.
Học sinh dùng công cụ mã hóa URL để chuẩn bị một giá trị mới, rồi giải mã nó và so lại kết quả.
Một chuỗi có phần thoát phần trăm bị thiếu, kiểu như %2. Học sinh nói rõ vì sao sau dấu phần trăm phải có đủ hai chữ số thập lục phân.
Một học sinh chép đường dẫn tìm kiếm trong thư viện, trong đó nhiều từ đã bị mã hóa. Địa chỉ hiện ra rất khó hiểu.
Em giải mã các giá trị truy vấn và xác nhận được những từ khóa cùng bộ lọc nào đã được dùng. Trước khi mở, em xem lại tên máy chủ.
Nhờ vậy em hiểu một trang web mang thông tin tìm kiếm từ trang này sang trang kia bằng cách nào.
Một người mới học lập trình gửi đi một yêu cầu có tên khóa học chứa dấu và. Máy chủ nhận tên ấy thành hai tham số tách rời.
Mở yêu cầu gốc ra xem, người ấy thấy dấu và đã không được mã hóa như một phần dữ liệu. Giá trị được chuẩn bị lại bằng một giao diện URL chuẩn rồi thử lại.
Công cụ giải mã giúp hiểu yêu cầu đó, nhưng cách sửa lâu dài là xử lý địa chỉ theo cấu trúc chứ không phải thay chuỗi bằng tay.
Một cô giáo nhận được đường dẫn tới tài liệu của lớp, nhưng nơi đến lại báo không tìm thấy tệp.
Địa chỉ được đem ra xem và giải mã. Hóa ra tên tệp có một dấu gạch chéo có thể bị hiểu thành dấu ngăn cách đường dẫn, hoặc một khoảng trắng chép sai.
Thay vì mò mẫm sửa một địa chỉ riêng tư mà mình không rành, cô xin người giữ tài liệu một đường dẫn chia sẻ mới.
Học sinh dựng một biểu mẫu tìm kiếm đơn giản rồi nhìn vào địa chỉ sau khi gửi đi một đoạn chữ có khoảng trắng và dấu câu.
Các em giải mã giá trị của từng tham số và đối chiếu với thứ mình đã gõ vào biểu mẫu. Cả lớp bàn vì sao trình duyệt phải mã hóa giá trị trước khi đặt vào địa chỉ.
Bài tập không dùng mật khẩu thật, hồ sơ học sinh hay câu trả lời riêng tư nào.
Đường dẫn trong bản tin của trường mang theo mấy tham số theo dõi. Cô giáo muốn biết trong đó có gì trước khi gửi đi.
Địa chỉ được tách ra thành từng tham số và các giá trị được giải mã. Những giá trị theo dõi không cần thiết chỉ nên bỏ đi nếu việc đó không làm hỏng nơi đến.
Đường dẫn cuối cùng phải được thử lại, chứ không mặc nhiên coi là vẫn chạy sau khi sửa tay.
Một lớp tin học thử đặt một câu ngắn không phải tiếng Anh vào địa chỉ. Kết quả mã hóa hiện ra nhiều chuỗi phần trăm liền nhau, vì ký tự UTF-8 có thể chiếm tới mấy byte.
Học sinh giải mã trọn chuỗi ấy rồi so với câu ban đầu. Bỏ đi một byte đã mã hóa là có thể sinh ra ký tự thay thế hoặc chữ vô nghĩa.
Hoạt động này cho thấy một ký tự nhìn thấy được không phải lúc nào cũng ứng với đúng một byte đã mã hóa.
Một người lập trình chờ thấy khoảng trắng thì lại gặp %2520. Chuỗi %25 đại diện cho dấu phần trăm, nên giải một lượt sẽ ra %20, và giải thêm lượt nữa mới có thể ra khoảng trắng.
Người ấy lần ngược xem giá trị đã bị mã hóa hai lần ở đâu. Cần sửa là dòng chảy dữ liệu, chứ không phải giải đi giải lại mọi thứ nhập vào.
Một đường dẫn giấu bên trong tham số kiểu redirect hay next một địa chỉ đã mã hóa khác.
Người dùng giải giá trị đó ra dạng văn bản thuần và xem tên máy chủ thật trước khi mở. Một địa chỉ đã mã hóa không đáng tin chỉ vì nơi đến cuối cùng của nó khó đọc.
| Dữ liệu vào | Kiểu mã hóa có thể | Công cụ đúng | Ví dụ sau khi giải |
|---|---|---|---|
lesson%20notes |
Mã hóa URL bằng dấu phần trăm | Giải mã URL | lesson notes |
<p> |
Thực thể HTML | Giải mã HTML | <p> |
SGVsbG8= |
Base64 | Giải mã Base64 | Hello |
u003F |
Chuỗi thoát Unicode | Bộ phân tích JSON hoặc của chính ngôn ngữ đó | ? |
Với các tham chiếu thực thể, hãy dùng công cụ giải mã HTML; còn công cụ giải mã Base64 thì chỉ dùng khi bạn biết chắc dữ liệu ở dạng đó.
Khoảng trắng thường được viết thành %20. Trong kiểu mã hóa truy vấn của biểu mẫu, dấu cộng cũng có thể được hiểu là một khoảng trắng.
Từ đó sinh ra một khác biệt đáng để ý:
class%20notes thường giải ra thành class notes.class+notes có thể giải ra thành class notes trong ngữ cảnh truy vấn của biểu mẫu.%2B.Hãy dùng cách giải mã được làm ra cho đúng thành phần và đúng định dạng đó. Bộ giải đường dẫn và bộ giải truy vấn biểu mẫu chưa chắc đã đối xử với dấu cộng giống nhau.
Mã hóa phần trăm làm việc trên từng byte. Một ký tự nằm ngoài vùng ASCII cơ bản có thể được biểu diễn bằng nhiều byte đã mã hóa.
Chẳng hạn một chữ cái có dấu hoặc một ký tự Ả Rập có thể hiện ra thành cả dãy nhiều đoạn thoát phần trăm. Mọi byte cần thiết phải còn nguyên và đúng thứ tự, rồi được đọc bằng đúng bảng mã ký tự.
Nếu kết quả có những ký hiệu thay thế, hãy kiểm tra xem:
Sau khi giải, các ký tự dành riêng có thể làm đổi cấu trúc. Hãy tách địa chỉ ra thành từng thành phần rồi giải đúng giá trị mình cần.
Giải nhiều lượt có thể biến dữ liệu vốn vô hại thành dấu ngăn cách thật sự hoặc thành đường dẫn ngoài dự tính. Hãy tìm hiểu vì sao lại có nhiều lớp mã hóa như vậy.
Thay %20 bằng khoảng trắng không xử lý được hết các ký tự đã mã hóa, các chuỗi UTF-8, phần nhập hỏng hay quy tắc của dấu cộng. Trong mã nguồn, hãy dùng một bộ phân tích địa chỉ đàng hoàng hoặc một giao diện chuẩn.
Giải nó ra dạng văn bản trước đã. Xem giao thức, tên máy chủ, đường dẫn và tham số rồi mới quyết định có vào hay không.
%26 và & đều có thể đại diện cho dấu và, mỗi cái trong ngữ cảnh riêng. Hãy chọn công cụ giải theo đúng cách biểu diễn đang có trước mặt.
Sau dấu phần trăm phải là hai chữ số thập lục phân. Chuỗi thiếu hoặc sai thường là dấu hiệu phần nhập đã hỏng.
Địa chỉ web có thể nằm lại trong lịch sử trình duyệt, nhật ký, số liệu thống kê, ảnh chụp màn hình và tin nhắn chuyển tay. Thông tin đăng nhập nhạy cảm không nên đặt vào chuỗi truy vấn.
Giá trị vừa giải ra có thể chứa những ký tự mang ý nghĩa riêng. Một dấu gạch chéo đã giải có thể ảnh hưởng tới đường dẫn, một dấu và có thể làm đổi tham số, còn các dấu ngoặc nhọn có thể biến thành thẻ đánh dấu nếu bị đặt sai chỗ trong trang.
Ứng dụng nên:
Giải mã không phải là làm sạch dữ liệu. Nó cho thấy các ký tự đang được biểu diễn, nhưng không quyết định chúng có an toàn cho HTML, cho đường dẫn tệp, cho câu lệnh cơ sở dữ liệu hay cho chuyển hướng hay không.
Một địa chỉ web có thể mang theo từ khóa tìm kiếm, mã tài liệu, địa chỉ thư điện tử, mã lớp, tên tệp, dữ liệu theo dõi và nhiều thứ khác. Giải mã chỉ làm những thứ ấy dễ đọc hơn chứ không hề bỏ chúng đi.
Đừng dán vào công cụ bên ngoài những đường dẫn nội bộ của trường, mã đặt lại mật khẩu, địa chỉ đã ký, đường dẫn tới hồ sơ học sinh hay dữ liệu đăng nhập. Khi dạy và khi trình bày cách dò lỗi, hãy thay giá trị nhạy cảm bằng ví dụ bịa ra.
Trước khi chia sẻ ảnh chụp màn hình của một địa chỉ đã giải, hãy xóa tên tài khoản, tên máy chủ nội bộ, các mã thông báo và mã tài liệu.
Người mới học nên ưu tiên các giao diện xử lý địa chỉ có sẵn. Trong JavaScript, có thể xem giá trị của một truy vấn như sau:
const url = new URL(
"https://example.edu/search?q=water%20cycle"
);
const query = url.searchParams.get("q");
console.log(query);
// water cycle
Cách này phân tích địa chỉ và trả về giá trị tham số đã giải sẵn. Nhìn chung nó an toàn hơn và sáng sủa hơn việc tự tay cắt cả chuỗi tại từng dấu hỏi, dấu và, dấu bằng.
Dùng công cụ mã hóa URL để chuẩn bị một đoạn chữ thành thành phần của địa chỉ, rồi giải mã lại để kiểm chứng một ví dụ trên lớp.
Nếu phần nhập có các thực thể kiểu &lt; hay &quot;, hãy dùng công cụ giải mã HTML. Còn với đoạn chữ đã biết chắc là Base64 thì có công cụ giải mã Base64.
Chọn đúng công cụ giải sẽ tránh được những lần biến đổi thừa và khiến việc dò lỗi đáng tin hơn hẳn.
Giải mã URL biến những chuỗi mã hóa bằng dấu phần trăm thành ký tự đọc được. Nó giúp học sinh hiểu địa chỉ web, và giúp người lập trình xem xét giá trị truy vấn, yêu cầu gửi tới API, chữ nhiều ngôn ngữ, chuyển hướng và những rắc rối do mã hóa hai lớp.
Cách an toàn nhất là xác định thành phần của địa chỉ, chỉ giải đúng phần cần giải, và giữ lại phần nhập ban đầu. Hãy coi kết quả là dữ liệu vẫn còn phải kiểm tra.
Một đường dẫn đã giải ra và dễ đọc thì dễ tìm hiểu hơn, nhưng không vì thế mà nó tự nhiên an toàn hay đúng đắn. Hãy xem lại cấu trúc, nơi đến, tham số, khía cạnh riêng tư và bảng mã ký tự đã định của nó trước khi dùng.