Передача закодированных строк base64 в URL

Безопасно ли передавать необработанные строки с кодировкой base64 через параметры GET?

Ответ 1

Нет, вам нужно будет его закодировать, поскольку строки base64 могут содержать символы "+", "=" и "/", которые могут изменить смысл ваших данных, - выглядят как подпапка.

Допустимые символы base64 находятся ниже.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

Ответ 2

Существуют дополнительные спецификации base64. (См. Таблицу здесь для специфики). Но по существу вам нужно 65 символов для кодирования: 26 строчных букв + 26 прописных букв + 10 цифр = 62.

Вам нужно еще два ['+', '/'] и дополнение char '='. Но ни один из них не является дружественным URL, поэтому просто использует разные символы для них, и вы настроены. Стандартные из диаграммы выше ['-', '_'], но вы можете использовать другие символы, пока вы их декодируете одинаково, и не нужно делиться с другими.

Я бы посоветовал просто писать собственные помощники. Подобно этим из комментариев на странице php для base64_encode:

function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

function base64_url_decode($input) {
 return base64_decode(strtr($input, '._-', '+/='));
}

Ответ 3

@joeshmo Или вместо написания вспомогательной функции вы можете просто ввести urlencode кодировку base64. Это будет делать то же самое, что и ваша вспомогательная функция, но без необходимости использования двух дополнительных функций.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );

Ответ 4

Вводная заметка Я склонен опубликовать несколько разъяснений, так как некоторые из ответов здесь были немного ошибочными (если не ошибочными).

Ответ NO, вы не можете просто передать кодированный base64 параметр в строке запроса URL-адреса, так как знаки плюс преобразуются в SPACE внутри глобального массива $_GET. Другими словами, если вы отправили test.php? MyVar = stringwith + знак в

//test.php
print $_GET['myVar'];

результатом будет:
stringwith sign

Простым способом решения этой проблемы является просто urlencode() ваша строка base64 перед добавлением ее в строку запроса, чтобы избежать кодов +, = и/символов в% ##. Например, urlencode("stringwith+sign") возвращает stringwith%2Bsign

Когда вы обрабатываете действие, PHP заботится о том, чтобы автоматически декодировать строку запроса, когда она заполняет глобальный $_GET. Например, если я отправил test.php? MyVar = stringwith% 2Bsign в

//test.php
print $_GET['myVar'];

результат будет следующим:
stringwith+sign

Вы не хотите, чтобы urldecode() возвращаемая строка $_GET, когда + будет преобразована в пробелы.
Другими словами, если я отправил тот же test.php? MyVar = stringwith% 2Bsign в

//test.php
$string = urldecode($_GET['myVar']);
print $string;

результат является неожиданным:
stringwith sign

Было бы безопасно rawurldecode() вход, однако он был бы лишним и, следовательно, ненужным.

Ответ 5

Да и нет.

Базовая кодировка base64 может в некоторых случаях сталкиваться с традиционными соглашениями, используемыми в URL-адресах. Но многие из реализации base64 позволяют вам изменить кодировку для соответствия URL-адресам лучше или даже прийти с одним (например, Python urlsafe_b64encode()).

Другая проблема, с которой вы можете столкнуться, - это ограничение длины URL или, скорее, отсутствие такого ограничения. Поскольку стандарты не указывают максимальную длину, браузеры, серверы, библиотеки и другое программное обеспечение, работающее с протоколом HTTP, могут определять свои собственные ограничения. Вы можете взглянуть на эту статью: WWW Часто задаваемые вопросы: какова максимальная длина URL-адреса?

Ответ 6

Я не думаю, что это безопасно, потому что, например, символ "=" используется в исходной базе 64 и также используется для дифференциации параметров из значений в HTTP GET.

Ответ 7

Его кодировка base64url вы можете попробовать, просто расширив код joeshmo выше.

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));
}

Ответ 8

Теоретически, да, если вы не превысите максимальную длину строки запроса url и /oor для клиента или сервера.

На практике все может стать немного сложнее. Например, он может вызвать исключение HttpRequestValidationException на ASP.NET, если значение имеет "on", и вы оставите его в конце == ==.

Ответ 9

Да, это всегда безопасно. Конечно, base64 содержит: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= но строка с кодировкой base64 обычно не имеет +. + преобразуется в пустое пространство, приводит к неправильной расшифровке строки. / безопасен в паре параметров получения. = всегда находится в конце строки с кодировкой base64, и серверная сторона может напрямую разрешить =.