Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 Base64 인코딩을 감지하는 방법

PHP에서 Base64 인코딩 감지하기

PHP로 개발하다 보면 전달받은 문자열이 Base64로 인코딩된 데이터인지 확인해야 하는 경우가 있습니다. 이 글에서는 ord()max() 함수를 활용해 문자열의 바이트 값을 분석하는 방법을 예제와 함께 살펴보고, 실무에서 바로 적용할 수 있는 추가 검증 기법도 함께 정리했습니다.

예제 코드

<?php
$value_1 = array();
foreach (str_split('az019AZ~~~!@#$%^*()_+|}?><": Iñtërnâtiônàlizætiøn') as $char) {
    echo ord($char) . "\n";
    $value_1[] = ord($char);
}
echo "Max value value_1 = " . max($value_1) . "\n";

$value_2 = array();
echo "\nbase64:\n";
foreach (str_split(base64_decode('Not base64 encoded', true)) as $char) {
    echo ord($char) . "\n";
    $value_2[] = ord($char);
}
echo "Max value_2 = " . max($value_2) . "\n";
?>

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.

97 122 48 49 57 65 90 126 126 126 33 64 35 36 37 94 42 40 41 95 43 124 125 63 62 60 34 58 32 73 195 177 116 195 171 114 110 195 162 116 105 195 180 110 195 160 108 105 122 195 166 116 105 195 184 110
Max value value_1 = 195

base64:
54 139 91 106 199 186 225 233 220 161 215 157
Max value_2 = 233

코드 설명

1단계 — 원본 문자열의 바이트 값 분석

str_split() 함수는 문자열을 한 글자씩 잘라 배열로 만들고, ord()는 각 문자의 바이트 값(아스키 코드)을 반환합니다. 이 값들을 배열에 모은 뒤 max()로 최댓값을 구합니다. 참고로 str_split()은 멀티바이트 문자를 바이트 단위로 처리하기 때문에, 'ñ'나 'ë' 같은 UTF-8 특수 문자는 195처럼 128 이상의 값으로 쪼개져 나타납니다.

2단계 — 디코딩 결과의 바이트 값 분석

base64_decode()의 두 번째 매개변수를 true로 설정하면 엄격(strict) 모드로 동작합니다. 이 모드에서는 Base64 알파벳에 속하지 않는 문자가 포함된 입력에 대해 false를 반환하므로, 디코딩이 가능한 경우에만 바이트 분석이 진행됩니다. 위 예제에서는 디코딩된 데이터의 최대 바이트 값이 233으로 확인되었습니다.

더 확실한 검증 방법

바이트 값 분석만으로 Base64 여부를 완벽하게 판별하기는 어렵습니다. 실무에서는 아래 두 가지 방법을 함께 사용하는 것이 좋습니다.

방법 1 — 정규식과 길이 검사

Base64 문자열은 영문 대소문자, 숫자, '+', '/' 그리고 '=' 패딩 문자로만 구성되며, 길이는 항상 4의 배수여야 합니다.

function is_base64(string $str): bool
{
    return preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $str) === 1
        && strlen($str) % 4 === 0;
}

방법 2 — 재인코딩(round-trip) 비교

문자열을 디코딩한 뒤 다시 인코딩했을 때 원본과 동일하다면, 해당 문자열은 유효한 Base64일 가능성이 높습니다.

function is_base64(string $str): bool
{
    return base64_encode(base64_decode($str, true)) === $str;
}

다만 원본 문자열에 공백이나 줄바꿈이 포함된 경우에는 비교 전에 이를 제거해 주는 것이 안전합니다.

마무리

이처럼 PHP에서는 ord()max()를 이용한 바이트 분석부터 정규식 검사, 재인코딩 비교까지 다양한 방법으로 Base64 인코딩 여부를 확인할 수 있습니다. 데이터의 성격과 요구 사항에 맞는 방법을 선택하거나, 여러 기법을 조합해 사용하면 더욱 신뢰할 수 있는 검증이 가능합니다.