Передача строк в кодировке base64 в URL



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

1465   9  

9 ответов:

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

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

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

Я бы рекомендовал просто написать своих собственных помощников. Например, из комментариев на странице руководства php для base64_encode:
function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

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

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

$str = 'Some String';

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

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

Ответ-Нет , Вы не можете просто передать параметр в кодировке base64 в строке запроса URL, так как знаки плюс преобразуются в пространство внутри глобального массива $_GET. Другими словами, если вы послали тест.php?myVar=stringwith+sign to

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

Результат был бы быть:
stringwith sign

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

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

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

Результат будет таким::
stringwith+sign

Вы делаете not want to urldecode() возвращенная строка $_GET в виде +'S будет преобразована в пробелы.
Другими словами, если бы я послал тот же тест .php?myVar=stringwith%2Bsign to

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

Результат неожиданный.:
stringwith sign

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

Да и нет.

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

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

Его код 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));
}

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

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

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

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

Comments

    Ничего не найдено.