Бортовой журнал Ктулху

Как определить закодированную в Base64 строку при помощи PHP

Base64 - это способ закодировать некие данные при помощи 64-х символов (a-zA-Z0-9) ASCII и дополнительных символов.

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

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

В качестве исходных данных можно взять какую-либо строку, например, абзац из книги Майкла Крайтона "Рой":

«Самооптимизация» — технический термин, которым это обозначается. Рой эволюционировал самостоятельно, менее успешные агенты погибали, более успешные воспроизводились в следующих поколениях. Через десять или сто поколений эволюционирующий рой приблизился к наилучшему решению. К оптимальному решению.

 В Base64 строка будет выглядеть так:

 

wqvQodCw0LzQvtC+0L/RgtC40LzQuNC30LDRhtC40Y/CuyDigJQg0YLQtdGF0L3QuNGH0LXRgdC60LjQuSDRgtC10YDQvNC40L0sINC60L7RgtC+0YDRi9C8INGN0YLQviDQvtCx0L7Qt9C90LDRh9Cw0LXRgtGB0Y8uINCg0L7QuSDRjdCy0L7Qu9GO0YbQuNC+0L3QuNGA0L7QstCw0Lsg0YHQsNC80L7RgdGC0L7Rj9GC0LXQu9GM0L3Qviwg0LzQtdC90LXQtSDRg9GB0L/QtdGI0L3Ri9C1INCw0LPQtdC90YLRiyDQv9C+0LPQuNCx0LDQu9C4LCDQsdC+0LvQtdC1INGD0YHQv9C10YjQvdGL0LUg0LLQvtGB0L/RgNC+0LjQt9Cy0L7QtNC40LvQuNGB0Ywg0LIg0YHQu9C10LTRg9GO0YnQuNGFINC/0L7QutC+0LvQtdC90LjRj9GFLiDQp9C10YDQtdC3INC00LXRgdGP0YLRjCDQuNC70Lgg0YHRgtC+INC/0L7QutC+0LvQtdC90LjQuSDRjdCy0L7Qu9GO0YbQuNC+0L3QuNGA0YPRjtGJ0LjQuSDRgNC+0Lkg0L/RgNC40LHQu9C40LfQuNC70YHRjyDQuiDQvdCw0LjQu9GD0YfRiNC10LzRgyDRgNC10YjQtdC90LjRji4g0Jog0L7Qv9GC0LjQvNCw0LvRjNC90L7QvNGDINGA0LXRiNC10L3QuNGOLg==

 

Одним из способов проверки может быть попытка декодировать исходную строку:

base64_decode($strting,true)

и в результате получится:

bool(false)

Для 99% случаев этого решения будет достаточно.

Если текст короткий, например "test", то такого решения будет недостаточно. Вместо false будет:

string(3) "��-"

Конечно, можно проверить регулярным выражением:

preg_match("/^[a-z0-9.]+$/i", base64_decode($string,true),$matches);
var_dump($matches);

И на выходе будет пустой массив, т.е., совпадений нет, строка не Base64.

Вывод: самым надежным решением будет декодирование исходной строки и проверка регулярным выражением.