Определите, закодирована ли строка в кодировке base64 дважды

Есть ли способ определить, закодирована ли строка в кодировке base64 дважды?

Например, есть ли шаблон регулярного выражения, который я могу использовать с preg_match для этого?

Я думаю, вы получили отрицательные голоса, потому что вопрос был немного неверно направлен и требовал больших усилий для ответа; приложить много усилий, чтобы ответить на вопрос, который не следовало задавать, разозлит людей. В следующий раз, когда вы зададите вопрос, постарайтесь избежать XY проблема.

Simon Shine 04.04.2018 17:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
1
7 003
1

Ответы 1

(Практический ответ.) Не использовать регулярное выражение. Расшифруйте вашу строку с помощью необязательного параметра base64_decode()$strict, установленного на true, и посмотрите, соответствует ли он ожидаемому формату. Или просто попробуйте декодировать его столько раз, сколько сможете. Например.:

function base64_decode_multiple(string $data, int $count = 2) {
    while ($count-- > 0 && ($decoded = base64_decode($data, true)) !== false) {
        $data = $decoded;
    }
    return $data;
}

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

Вы можете проверить, является ли что-то однажды в кодировке base64, поскольку вы можете проверить каждый набор из четырех символов. Последние четыре байта в сообщении с кодировкой base64 могут быть особым случаем, потому что = используются в качестве заполнения. Используя регулярное выражение:

<char>           := [A-Za-z0-9+/]
<end-char>       := [A-Za-z0-9+/=]
<chunk>          := <char>{4}
<end-chunk>      := <char>{2} <end-char>{2} | <char>{3} <end-char>
<base64-encoded> := <chunk>* <end-chunk>?

Вы также можете определить, является ли что-то дважды в кодировке base64, используя регулярные выражения, но решение не является тривиальным или красивым, поскольку недостаточно проверять 4 байта за раз.

Пример: "QUFBQQ ==" base64-декодирует до "AAAA", который base64-декодирует до трех NUL-байтов:

$ echo -n "QUFBQQ= = " | base64 -d | xxd
00000000: 4141 4141                                AAAA

$ echo -n "AAAA" | base64 -d | xxd
00000000: 0000 00                                  ...

На этом этапе мы могли бы перечислить все кодировки double-base64, где кодировка base64 составляет 4 байта в алфавите base64 («AAAA», «AAAB», «AAAC», «AAAD» и т. д.) И минимизировать это:

<ugly 4> := QUFBQQ== | QUFBQg== | QUFBQw== | QUFBRA== | ...

И мы могли бы перечислить первые 4 байта всех кодировок double-base64, где кодировка base64 составляет 8 байтов или больше (случаи, которые не связаны с заполнением с помощью =), и минимизировать это:

<chunk 4> := QUFB | QkFB | Q0FB | REFB | ...

Один раздел (красивый) строк с двойной кодировкой base64 не будет содержать в конце =; их длина кратна 8:

<pretty double-base64-encoded> := <chunk 4>{2}*

Другой раздел строк с двойной кодировкой base64 будет иметь длину, кратную 4, но не 8 (4, 12, 20 и т. д.); их можно считать красивыми с уродливым концом в конце:

<ugly double-base64-encoded> := <chunk 4>{2}* <ugly 4>

Затем мы могли бы построить комбинированное регулярное выражение:

<double-base64-encoded> := <pretty double-base64-encoded>
                         | <ugly double-base64-encoded>

Как я уже сказал, вы, вероятно, не захотите проходить через весь этот беспорядок только потому, что сообщения с двойной кодировкой base64 находятся обычны. Точно так же, как вы не хотите проверять, находится ли целое число в каком-то конечном интервале. Кроме того, это хороший пример неправильного ответа, когда вы должны были задать другой вопрос. :-)

Другие вопросы по теме