В настоящее время я работаю на веб-сайте, где у меня есть смешанные значения, хранящиеся в моей базе данных, и я хотел бы найти решение для обнаружения строки для шифрования base64 или нет. До сих пор я придумал этот фрагмент кода с помощью Абхинава Бхардваджа в этом посте (Определить кодировку base64 в PHP?):
function IsBase64($s)
{
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false;
// Decode the string in strict mode and check the results
$decoded = base64_decode($s, true);
if(false === $decoded) return false;
// if string returned contains not printable chars
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
// Encode the string again
if(base64_encode($decoded) != $s) return false;
return true;
}
Он работает только наполовину, например значения, такие как 1234, 7000, Reno и другие четырехбуквенные и цифровые вводы, разрешаются как истинные, даже если они не … Теперь мой вопрос: есть ли надежный способ обнаружения base64 или у меня есть вести список некодированных и закодированных таблиц и обращаться с ними по-разному?
Мой план состоял бы в том, чтобы объединить данные (некоторые из которых нуждаются в расшифровке, а некоторые нет) вместе в конце в один объект результата php и вернуть его в виде текста JSON.
Любая помощь в этом очень ценится!
Заранее благодарю!
РЕДАКТИРОВАТЬ: После ответа Йоши я хочу прикрепить мой вывод на вершине для тех, кто ищет простое решение для кодирования / декодирования конкретных данных:
Я думаю, что лучше всего было бы хранить кодированные данные под определенным ключом в БД и просматривать результат в наборе данных запроса, если этот конкретный ключ содержится для отслеживания содержимого, которое необходимо расшифровать …
К вашему сведению: я обновил свой сайт в соответствии с этим поведением, и я должен признать, что он работает как шарм!
Строка в кодировке base64 в основном (A-Z), (a-z), (0-9) дополняется символом от = до mod 4. Поэтому любая комбинация букв, кратная 4, действительна для base64.
function IsBase64($str) {
if (strlen($str) % 4 == 0) {
return true;
} else {
return false;
}
}
Я опубликую комментарий Йоши в качестве окончательного заключения:
Я думаю, что вам не повезло. Упоминаемые вами ложные срабатывания все еще являются действительными кодировками base64. Вам нужно будет оценить, имеет ли смысл декодированная версия, но это, вероятно, будет бесконечной историей, и в конечном итоге, вероятно, также приведет к ложным срабатываниям. — Йоши