PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPでBase64エンコードを検出・判定する方法をわかりやすく解説

PHPで文字列がBase64エンコードされているかどうかを判定するのは、一見簡単そうに見えて実は意外と難しい問題です。本記事では、ord()関数を使って各バイト値を調べることで、データがプレーンテキストなのか、それともBase64デコードによって得られたバイナリデータなのかを見分ける手法を紹介します。

検出の基本的な考え方

通常のASCIIテキストはバイト値が0〜127の範囲に収まります。一方、画像などのバイナリデータをBase64でエンコードしてからデコードすると、128以上のバイト値が多く含まれる傾向があります。この性質を利用し、デコード結果の最大バイト値を比較することで、そのデータがエンコード済みのバイナリかどうかを推測できます。

サンプルコード

<?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 "nnbase64: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";
?>

実行結果

上記のコードを実行すると、次のような出力が得られます。

97n122n48n49n57n65n90n126n126n126n33n64n35n36n37n94n42n40n41n95n43n124n125n63n62n60n34n58n32n73n195n177n116n195n171n114n110n195n162n116n105n195n180n110n195n160n108n105n122n195n166n116n105n195n184n110nMax value value_1 = 195 nnbase64:n54n139n91n106n199n186n225n233n220n161n215n157nMax value_2 = 233

コードの解説

最初のループでは、英数字や記号、さらに「ñ」「ë」などのマルチバイトUTF-8文字を含む文字列をstr_split()で1文字ずつ分解し、ord()でバイト値を取得しています。UTF-8のマルチバイト文字は先頭バイトが195(0xC3)となるため、最大値は195になっています。

次のループでは、base64_decode()の第2引数にtrue(strictモード)を指定してデコードを行い、同様にバイト値を調べています。その結果、最大値として233という、通常のテキストではほとんど現れない高いバイト値が確認できました。

より確実なBase64判定方法

バイト値の比較だけでは誤判定が生じる可能性もあるため、実務では以下の方法を組み合わせるのがおすすめです。

1. strictモードでのデコード結果を確認する

base64_decode($str, true)は、文字列がBase64として不正な場合にfalseを返します。まずはこの戻り値をチェックしましょう。

2. 再エンコードして元の文字列と一致するか検証する

base64_encode(base64_decode($str)) === $strが成立すれば、その文字列は有効なBase64である可能性が非常に高いといえます。

3. 正規表現で使用文字をチェックする

Base64で使用されるのは「A〜Z」「a〜z」「0〜9」「+」「/」「=」のみです。次のようなパターンで事前に絞り込むことができます。

preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $str);

これらの方法を組み合わせることで、PHPでも精度高くBase64エンコードの検出・判定を行うことが可能です。

  1. PHPでASCIIをUTF-8エンコーディングに変換する方法

    現在の文字エンコーディングがASCIIであることが分かっている場合、iconv関数を使用することで、文字列をUTF-8に変換できます。iconv関数には、「入力エンコーディング」「出力エンコーディング」「変換対象となる元の文字列」の3つを引数として渡します。 方法1:iconv関数で変換する サンプルコード <?php     $str = "ábrêcWtë";     echo 元の文字列:, $str, PHP_EOL;     ech

  2. PHPのFPDIライブラリでエンコーディングを設定する方法

    FPDIライブラリでのエンコーディング設定の基本FPDIライブラリでPDFのエンコーディングを正しく扱うには、必要な文字セット(アルファベット)を含む新しいフォントを追加します。基本的な手順は以下のコードの通りです。$pdf->AddFont(DejaVu,,DejaVuSansCondensed.php);$pdf->SetFont(DejaVu, , 10, , false);このように AddFont() で使用したいフォントを登録し、SetFont() でそのフォントを有効化することで、多言語の文字をPDF上に表示できるようになります。利用可能な主なエンコーディング一覧FP