Phần này chứa thông số kỹ thuật chi tiết về cách ứng dụng kiểm tra URL.
Chuẩn hoá URL
Trước khi kiểm tra bất kỳ URL nào, ứng dụng dự kiến sẽ thực hiện một số hoạt động chuẩn hoá trên URL đó.
Để bắt đầu, chúng ta giả định rằng ứng dụng đã phân tích cú pháp URL và làm cho URL đó hợp lệ theo RFC 2396. Nếu URL sử dụng tên miền quốc tế hoá (IDN), thì ứng dụng phải chuyển đổi URL thành dạng trình bày ASCII Punycode. URL phải bao gồm một thành phần đường dẫn; tức là URL phải có ít nhất một dấu gạch chéo theo sau miền (http://google.com/
thay vì http://google.com
).
Trước tiên, hãy xoá các ký tự tab (0x09), CR (0x0d) và LF (0x0a) khỏi URL. Không xoá các chuỗi thoát cho các ký tự này (ví dụ: %0a
).
Thứ hai, nếu URL kết thúc bằng một mảnh, hãy xoá mảnh đó. Ví dụ: rút gọn http://google.com/#frag
thành http://google.com/
.
Thứ ba, liên tục thoát ký tự phần trăm khỏi URL cho đến khi không còn ký tự thoát phần trăm nào nữa. (Việc này có thể khiến URL không hợp lệ.)
Cách chuẩn hoá tên máy chủ:
Trích xuất tên máy chủ từ URL, sau đó:
- Xoá tất cả dấu chấm ở đầu và cuối.
- Thay thế các dấu chấm liên tiếp bằng một dấu chấm.
- Nếu có thể phân tích cú pháp tên máy chủ dưới dạng địa chỉ IPv4, hãy chuẩn hoá tên máy chủ thành 4 giá trị thập phân được phân tách bằng dấu chấm. Ứng dụng phải xử lý mọi phương thức mã hoá địa chỉ IP hợp pháp, bao gồm cả bát phân, thập lục phân và ít hơn 4 thành phần.
- Nếu tên máy chủ có thể được phân tích cú pháp dưới dạng địa chỉ IPv6 trong dấu ngoặc đơn, hãy chuẩn hoá tên máy chủ đó bằng cách xoá các số 0 ở đầu không cần thiết trong các thành phần và thu gọn các thành phần bằng số 0 bằng cách sử dụng cú pháp dấu hai chấm. Ví dụ:
[2001:0db8:0000::1]
phải được chuyển đổi thành[2001:db8::1]
. Nếu tên máy chủ là một trong hai loại địa chỉ IPv6 đặc biệt sau, hãy chuyển đổi các địa chỉ đó thành IPv4:- Địa chỉ IPv6 được liên kết với IPv4, chẳng hạn như
[::ffff:1.2.3.4]
, sẽ được chuyển đổi thành1.2.3.4
; - Địa chỉ NAT64 sử dụng tiền tố 64:ff9b::/96 đã biết, chẳng hạn như
[64:ff9b::1.2.3.4]
, sẽ được chuyển đổi thành1.2.3.4
.
- Địa chỉ IPv6 được liên kết với IPv4, chẳng hạn như
- Đặt toàn bộ chuỗi ở dạng chữ thường.
Cách chuẩn hoá đường dẫn:
- Giải quyết các trình tự
/../
và/./
trong đường dẫn bằng cách thay thế/./
bằng/
và xoá/../
cùng với thành phần đường dẫn trước đó. - Thay thế các chuỗi dấu gạch chéo liên tiếp bằng một ký tự dấu gạch chéo.
Không áp dụng các quy tắc chuẩn hoá đường dẫn này cho các thông số truy vấn.
Trong URL, hãy thoát bằng ký tự phần trăm tất cả ký tự <= ASCII 32, >= 127, #
hoặc %
. Các ký tự thoát phải sử dụng ký tự hex viết hoa.
Biểu thức tiền tố đường dẫn hậu tố máy chủ
Sau khi URL được chuẩn hoá, bước tiếp theo là tạo biểu thức hậu tố/tiền tố. Mỗi biểu thức hậu tố/tiền tố bao gồm một hậu tố máy chủ (hoặc máy chủ đầy đủ) và một tiền tố đường dẫn (hoặc đường dẫn đầy đủ).
Ứng dụng khách sẽ tạo ra tối đa 30 tổ hợp hậu tố máy chủ lưu trữ và tiền tố đường dẫn có thể có. Các tổ hợp này chỉ sử dụng thành phần máy chủ lưu trữ và đường dẫn của URL. Lược đồ, tên người dùng, mật khẩu và cổng sẽ bị loại bỏ. Nếu URL có chứa tham số truy vấn, thì ít nhất một tổ hợp sẽ bao gồm đường dẫn đầy đủ và tham số truy vấn.
Đối với máy chủ, ứng dụng sẽ thử tối đa 5 chuỗi khác nhau. Các loại chiến dịch phụ đó là:
- Nếu tên máy chủ không phải là giá trị cố định IPv4 hoặc IPv6, thì tối đa 4 tên máy chủ được tạo bằng cách bắt đầu bằng miền eTLD+1 và thêm các thành phần dẫn đầu liên tiếp. Việc xác định eTLD+1 phải dựa trên Danh sách hậu tố công khai. Ví dụ:
a.b.example.com
sẽ dẫn đến miền eTLD+1 củaexample.com
cũng như máy chủ lưu trữ có thêm một thành phần máy chủ lưu trữb.example.com
. - Tên máy chủ chính xác trong URL. Tiếp nối ví dụ trước,
a.b.example.com
sẽ được kiểm tra.
Đối với đường dẫn, ứng dụng sẽ thử tối đa 6 chuỗi khác nhau. Các loại chiến dịch phụ đó là:
- Đường dẫn chính xác của URL, bao gồm cả tham số truy vấn.
- Đường dẫn chính xác của URL, không có tham số truy vấn.
- Bốn đường dẫn được tạo bằng cách bắt đầu từ thư mục gốc (/) và nối tiếp các thành phần đường dẫn, bao gồm cả dấu gạch chéo ở cuối.
Các ví dụ sau đây minh hoạ hành vi kiểm tra:
Đối với URL http://a.b.com/1/2.html?param=1
, ứng dụng sẽ thử các chuỗi có thể có sau:
a.b.com/1/2.html?param=1
a.b.com/1/2.html
a.b.com/
a.b.com/1/
b.com/1/2.html?param=1
b.com/1/2.html
b.com/
b.com/1/
Đối với URL http://a.b.c.d.e.f.com/1.html
, ứng dụng sẽ thử các chuỗi có thể có sau:
a.b.c.d.e.f.com/1.html
a.b.c.d.e.f.com/
c.d.e.f.com/1.html
c.d.e.f.com/
d.e.f.com/1.html
d.e.f.com/
e.f.com/1.html
e.f.com/
f.com/1.html
f.com/
(Lưu ý: bỏ qua b.c.d.e.f.com
vì chúng ta sẽ chỉ lấy 5 thành phần tên máy chủ cuối cùng và tên máy chủ đầy đủ.)
Đối với URL http://1.2.3.4/1/
, ứng dụng sẽ thử các chuỗi có thể có sau:
1.2.3.4/1/
1.2.3.4/
Đối với URL http://example.co.uk/1
, ứng dụng sẽ thử các chuỗi có thể có sau:
example.co.uk/1
example.co.uk/
Băm
Tính năng Duyệt web an toàn của Google chỉ sử dụng SHA256 làm hàm băm. Bạn nên áp dụng hàm băm này cho các biểu thức ở trên.
Tuỳ thuộc vào trường hợp, hàm băm đầy đủ 32 byte sẽ bị cắt bớt thành 4 byte, 8 byte hoặc 16 byte:
Khi sử dụng phương thức hashes.search, chúng tôi hiện yêu cầu các hàm băm trong yêu cầu phải được cắt bớt chính xác còn 4 byte. Việc gửi thêm byte trong yêu cầu này sẽ làm tổn hại đến quyền riêng tư của người dùng.
Khi tải danh sách xuống cho cơ sở dữ liệu cục bộ bằng phương thức hashList.get hoặc phương thức hashLists.batchGet, độ dài của hàm băm do máy chủ gửi được mã hoá theo quy ước đặt tên của các danh sách chứa hậu tố cho biết độ dài hàm băm. Hãy xem phần Danh sách có sẵn để biết thêm chi tiết.