Какой лучший кандидат для заполнения символов для безопасного URL-адреса и безопасного имени файла base64?

Символ заполнения для официального base64 - '=', который, возможно, потребуется закодировать в процентах при использовании в URL-адресе. Я пытаюсь найти лучший заполнитель, чтобы моя закодированная строка могла быть как URL-адрес (я буду использовать закодированную строку в качестве значения параметра, например id = encodedString), так и безопасным для имени файла (я буду использовать закодированную строка прямо как имя файла).

Точка ('.') - популярный кандидат, он безопасен для URL-адресов, но не совсем безопасен для имени файла: Windows не разрешает имя файла, заканчивающееся точкой в ​​конце.

'!' кажется жизнеспособным выбором, хотя я погуглил и никогда не видел, чтобы кто-нибудь использовал его в качестве символа заполнения. Любые идеи? Спасибо!

Обновление: я заменил "+" на "-" (минус) и заменил "/" на "_" (подчеркивание) в моей настраиваемой кодировке base64, поэтому '-' или '_' не больше не доступен для padding char.


person SamS    schedule 18.03.2009    source источник


Ответы (4)


Лучшее решение (в прошлом месяце я работал над этой проблемой с веб-сайтом отправки электронной почты) - вообще не использовать символ заполнения (=).

Единственная причина, по которой существует символ заполнения, - это "ленивые" декодеры. Вы можете очень легко добавить missing = -> просто введите% 4 в текст и вычтите полученное число из 4, и это то, сколько = вам нужно добавить в конец строки. Вот код C #:

    var pad = 4 - (text.Length % 4);
    if (pad < 4)
        text = text.PadRight(text.Length + pad, '=');

Кроме того, большинство людей, которые делают это, заинтересованы в замене + и / другим безопасным символом URL ... Я предлагаю:

  • заменить на - / заменить на _

НЕ ИСПОЛЬЗУЙ . поскольку он может давать сумасшедшие результаты в разных системах / веб-серверах (например, в кодировке IIS Base64 строка не может заканчиваться на. или IIS будет искать файл)

person nikib3ro    schedule 01.06.2012
comment
Не совсем правильно, результат заполнения не делится на 4. Необходимо добавить (4-значное) количество символов '=', а не номер поля. В остальном аккуратное решение. - person Young Bob; 11.02.2014
comment
@YoungBob Я отредактировал ответ, пожалуйста, отредактируйте его, если вы можете предложить лучший код. Спасибо! - person nikib3ro; 11.02.2014

Незарезервированные символы RFC 2396 в URI:

"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

Однако стоит отметить, что в статье Microsoft также говорится: «Не учитывайте регистр». Возможно, вам стоит просто придерживаться базы 16 или 32?

person Miles    schedule 18.03.2009
comment
Я бы избегал. ~ * '() для имен файлов, хотя - person cobbal; 18.03.2009
comment
Спасибо, Майлз, похоже, "!" подходит как для URL-адреса, так и для имени файла. Может быть, я выберу base32 с '!' как заполнитель. - person SamS; 18.03.2009

В статье Википедии говорится;

существует модифицированный вариант Base64 для URL-адреса, в котором не будет использоваться дополнение '='

person bob    schedule 06.12.2010

Я бы пошел с '-' или '_'. Они безопасны для URL и файлов, и они более или менее похожи на заполнение.

person cobbal    schedule 18.03.2009
comment
Извините, я должен был упомянуть об этом: я заменил + на - (минус) и заменил / на (подчеркивание) в моей настраиваемой кодировке base64, поэтому '-' или '' недоступны для символа заполнения больше. - person SamS; 18.03.2009