PHP PR

【PHP】PDFファイルのアップロード機能を追加する方法

【PHP】PDFファイルのアップロード機能を追加する方法
記事内に商品プロモーションを含む場合があります

お客様から、
既存システムにPDFファイルをアップロードする機能を追加したという依頼を頂きました。

そこで、今回は、PHPでPDFファイルをアップロードする方法について少し説明したいと思います。

PHPでPDFファイルをアップロードする方法

まず、PDFファイルを選択するための画面のHTMLを用意します。

</body>


<form action="check.php" method="POST" enctype="multipart/form-data">
<input type="file" name="pdf_file"><br>
<input type="submit" value="アップロード">
</form>


</body>

次に、PDFファイルのアップロード処理を行うPHP側のコードを書きます。

<?php
if(is_uploaded_file($_FILES["pdf_file"]["tmp_name"])){

if(move_uploaded_file($_FILES["pdf_file"]["tmp_name"], "ファイルの移動先のパス")){
echo "アップロード完了です。";
}else{
echo "アップロードに失敗しました。";
}

}
?>

みたいになりますね。
※かなり雑なコードですが。。。

これで完了であれば非常に簡単なんです。
ですが、PDFファイルのアップロード機能なので、PDF以外のファイルをアップロードしていないかのチェックを行わないといけません。

例えば、悪意のあるスクリプトを記述したHTMLなどをアップロードされると深刻な脆弱性になってしまうこともあります。
アップロードするファイルの種類が決まっている場合、必ずファイルのチェック処理は行って下さい。

そのための処理を追加したのですが、今回ここで問題が1つ発生しました・・・

まずは、以下のコードで拡張子のチェックを行います。

//拡張子をチェック
$ext = pathinfo($_FILES["pdf_file"]["name"], PATHINFO_EXTENSION);
if($ext != "pdf"){
echo "ファイルの拡張子が不正です。\n";
}

これは問題なし!!

次に、以下のコードでファイルタイプのチェックを行います。

//ファイルのMINEタイプをチェック
if($_FILES["pdf_file"]["type"] != "application/pdf"){
echo "ファイルのMINEタイプが不正です。\nアップロード可能なファイルはPDFのみです。\n";
}

これも問題が無いように思いますが、テストしてみるとまずい動作が見つかりました。

テストの為に画像(今回はJPEGファイル)の拡張子を無理やり「.pdf」に変更してアップロードしてみたのですが、
なぜかこのチェック処理を抜けてアップロードできてしまいます。

どうも、
$_FILES[“pdf_file”][“type”]に入っているファイルタイプが、
「image/jpeg」ではなく「application/pdf」になってしまっているようです。
拡張子を無理やり変えただけのファイルまでPDFファイルとして認識されてしまうのは気持ちが悪いのです。

そこで、今回は以下のコードに書き換えてやることで、
こちらの意図通りの処理を行うことが出来ました。

//ファイルのMINEタイプをチェック
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($fileinfo, $_FILES["pdf_file"]["tmp_name"]);
finfo_close($fileinfo);
if($mimeType != "application/pdf"){
echo "ファイルのMINEタイプが不正です。\nアップロード可能なファイルはPDFのみです。\n";
exit;
}

ブログに全コードを記載するのは大変なので、かなりおおざっぱなコードになってしまいました。
ですが、取りあえずこんな感じでPDFファイルのアップロード機能の追加は可能です。