Có an toàn để vượt qua các chuỗi mã hóa cơ sở thô thông qua các tham số GET không?
Có an toàn để vượt qua các chuỗi mã hóa cơ sở thô thông qua các tham số GET không?
Câu trả lời:
Không, bạn sẽ cần mã hóa url, vì các chuỗi base64 có thể chứa các ký tự "+", "=" và "/" có thể thay đổi ý nghĩa của dữ liệu của bạn - trông giống như một thư mục con.
Dưới đây là ký tự base64 hợp lệ.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Có thêm thông số kỹ thuật base64. (Xem bảng ở đây để biết chi tiết). Nhưng về cơ bản, bạn cần 65 ký tự để mã hóa: 26 chữ thường + 26 chữ hoa + 10 chữ số = 62.
Bạn cần thêm hai ['+', '/'] và phần đệm char '='. Nhưng không ai trong số họ thân thiện với url, vì vậy chỉ cần sử dụng các ký tự khác nhau cho họ và bạn đã thiết lập. Các tiêu chuẩn từ biểu đồ trên là ['-', '_'], nhưng bạn có thể sử dụng các ký tự khác miễn là bạn giải mã chúng giống nhau và không cần chia sẻ với người khác.
Tôi khuyên bạn chỉ nên viết người trợ giúp của riêng bạn. Giống như những nhận xét này từ trang hướng dẫn sử dụng php cho base64_encode :
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
theo đề xuất của câu trả lời của Rodrigo-silveira. Tạo hai chức năng mới để lưu vài ký tự theo chiều dài url, giống như vào nhà bạn đi qua cửa sổ thay vì chỉ sử dụng cửa.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
nên được mã hóa thành url %2C
, tôi khuyên bạn nên sử dụng ._-
thay vì -_,
giống như biến thể duy nhất trong en.wikipedia.org/wiki/Base64#Variants_summary_table giữ dấu vết =
@joeshmo Hoặc thay vì viết hàm trợ giúp, bạn chỉ có thể urlencode chuỗi mã hóa base64. Điều này sẽ làm chính xác như chức năng trợ giúp của bạn, nhưng không cần hai chức năng bổ sung.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
ký tự nếu bạn vượt qua nó không phải là tham số GET, mà là một đường dẫn trong URL. Nó sẽ thay đổi đường dẫn của bạn nếu bạn không thay thế /
bằng thứ khác ở cả hai phía.
Giới thiệu Lưu ý Tôi có xu hướng đăng một vài làm rõ vì một số câu trả lời ở đây có một chút sai lệch (nếu không chính xác).
Câu trả lời là KHÔNG , bạn không thể đơn giản chuyển một tham số được mã hóa base64 trong chuỗi truy vấn URL vì các dấu cộng được chuyển đổi thành SPACE bên trong mảng toàn cầu $ _GET. Nói cách khác, nếu bạn đã gửi test.php? MyVar = stringwith + đăng nhập vào
//test.php
print $_GET['myVar'];
kết quả sẽ là:
stringwith sign
Cách dễ dàng để giải quyết vấn đề này chỉ đơn giản là urlencode()
chuỗi base64 của bạn trước khi thêm nó vào chuỗi truy vấn để thoát các dấu +, = và / ký tự thành mã% ##. Ví dụ,urlencode("stringwith+sign")
trả vềstringwith%2Bsign
Khi bạn xử lý hành động, PHP sẽ tự động giải mã chuỗi truy vấn khi nó tạo ra toàn cầu $ _GET. Ví dụ: nếu tôi đã gửi test.php? MyVar = stringwith% 2Bsign to
//test.php
print $_GET['myVar'];
kết quả sẽ là:
stringwith+sign
Bạn không muốn urldecode()
chuỗi $ _GET được trả về vì + sẽ được chuyển đổi thành khoảng trắng.
Nói cách khác, nếu tôi đã gửi cùng test.php? MyVar = stringwith% 2Bignign to
//test.php
$string = urldecode($_GET['myVar']);
print $string;
kết quả thật bất ngờ:
stringwith sign
Nó sẽ an toàn cho rawurldecode()
đầu vào, tuy nhiên, nó sẽ dư thừa và do đó không cần thiết.
<br>
, vì vậy không cần phải nhập nhiều HTML. Tôi hy vọng điều này có ích, tôi đã chỉnh sửa câu trả lời của bạn một chút để cải thiện nó nhiều hơn nữa.
Có và không.
Bộ ký tự cơ bản của base64 trong một số trường hợp có thể va chạm với các quy ước truyền thống được sử dụng trong URL. Nhưng nhiều triển khai cơ sở64 cho phép bạn thay đổi bộ ký tự để phù hợp với các URL tốt hơn hoặc thậm chí đi kèm với một (như của Python urlsafe_b64encode()
).
Một vấn đề khác bạn có thể gặp phải là giới hạn độ dài URL hoặc đúng hơn - thiếu giới hạn đó. Vì các tiêu chuẩn không chỉ định bất kỳ độ dài tối đa nào, trình duyệt, máy chủ, thư viện và phần mềm khác hoạt động với giao thức HTTP có thể xác định giới hạn của chính nó. Bạn có thể xem bài viết này: Câu hỏi thường gặp về WWW: Độ dài tối đa của URL là bao nhiêu?
Đây là một mã hóa base64url mà bạn có thể thử, nó chỉ là phần mở rộng của mã joeshmo ở trên.
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
Về lý thuyết, có, miễn là bạn không vượt quá độ dài chuỗi truy vấn và / oor tối đa cho máy khách hoặc máy chủ.
Trong thực tế, mọi thứ có thể trở nên phức tạp hơn một chút. Ví dụ: nó có thể kích hoạt một HTTPRequestValidationException trên ASP.NET nếu giá trị xảy ra có chứa "bật" và bạn để lại dấu vết "==".
Đối với mã hóa an toàn url, như base64.urlsafe_b64encode(...)
trong Python mã bên dưới, hoạt động với tôi 100%
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
Có, nó luôn luôn an toàn. tất nhiên base64 chứa:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
nhưng một chuỗi được mã hóa base64 thường không có +
. +
sẽ được chuyển đổi thành một khoảng trắng, dẫn đến chuỗi giải mã sai. /
là an toàn trong một cặp tham số get. =
luôn ở cuối chuỗi mã hóa base64 và phía máy chủ có thể giải quyết =
trực tiếp.