ウイルススキャン · 1 min read · Dec 07, 2025
アップロードされたファイルをphp-clamavlibで自動的にウイルススキャンする方法 - ページ 2
5 小さな例
ここでは、HTMLアップロードフォームを含む小さなアップロードスクリプト /var/www/upload.php を作成します。フォームを送信すると、スクリプトは自分自身を呼び出し、cl_info()、cl_scanfile()、cl_setlimits()、およびclam_get_version()を使用してアップロードされたファイルをウイルススキャンします。ファイルが問題ない場合は、/var/www/uploads にアップロードされます。そうでない場合、スクリプトはエラーメッセージ(見つかったウイルス/ワームなどを示す)を表示し、サーバー上のファイルを削除します。
まず、/var/www/uploads ディレクトリを作成し、Apacheユーザーであるwww-dataが書き込み可能にします:
mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads
次に、ファイル /var/www/upload.php を作成します:
vi /var/www/upload.php| ClamAVバージョン: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> |
ファイルをアップロードするためのフォームが含まれています:
| [...] [...] |
ファイルを選択して送信ボタンをクリックすると、スクリプトは自分自身を呼び出し( action=”upload.php”)、上部のPHPコードを実行します:
| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= 'ファイルをアップロードしてください!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'マルウェアがあります: '.$malware.' |
ClamAVバージョン: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
アップロードされたファイルに関する詳細は$_FILES配列に保存されるため、それを使用してファイルをチェックします(配列に何が保存されているかを見るためにprint_r($_FILES);行のコメントを外すことができます)。
私はcl_setlimits()関数を使用して、ウイルススキャンプロセスの制限を設定し、DOS攻撃を防ぎます(ウイルススキャンプロセスがシステムのすべてのリソースを消費する可能性があるため)。使用法は次のとおりです:
cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) - $maxreclevel: 整数値 / 最大再帰レベル /
- $maxfiles: 整数値 / アーカイブ内でスキャンされる最大ファイル数 /
- $maxratio: 整数値 / 最大圧縮比 /
- $archivememlim: ブール値 / bzip2のメモリ使用量を制限する (0/1) /
- $maxfilesize: 長整数 / この値(バイト単位)を超えるアーカイブファイルはスキャンされません /
基本的に、これらの値は、アーカイブ(zipファイル、tar.gzファイル、bz2ファイルなど)がスキャンされるときのClamAVの動作を定義します。cl_setlimits()関数を使用しない場合、php.iniからのそれぞれの値が取られます。
主な関数はcl_scanfile()関数で、スキャンするファイルのパスを引数として受け取ります。アップロードされたファイルは処理される前に一時的に保存されます(通常は/tmp; php.iniの設定によります)。その一時ファイルは$_FILES[‘file’][‘tmp_name’]に保存されるため、その変数をcl_scanfile()関数に渡します。ウイルスが見つからない場合はFALSEを返し、見つかった場合は見つかったウイルスの名前を返します。
clam_get_version()は引数を取らず、インストールされたClamAVのバージョンを返します(例: 0.88.4)。
最後に、cl_info()関数を使用します。この関数も引数を取らず、ClamAVに関する詳細情報を表示します。たとえば、ClamAVバージョン0.88.4で85917のウイルスシグネチャが読み込まれています。
さて、テストを行いましょう。ブラウザでhttp://192.168.0.100/upload.phpと入力してください。次のように表示されるはずです:

[…]
ファイルを選択してアップロードボタンをクリックすると、アップロードが成功し、次のように表示されるはずです:

次に、テスト用のウイルスを取得する必要があります。幸いなことに、Eicarテストウイルスがあります。これは害を及ぼさないファイルですが、そのシグネチャはすべてのウイルススキャナーに含まれているため、このテストウイルスを使用してウイルススキャナーが機能しているかどうかをテストできます。http://www.eicar.org/anti_virus_test_file.htm にアクセスし、eicar.com、eicar_com.zip、およびeicarcom2.zipファイルをハードディスクにダウンロードしてください。それから、各ファイルでアップロードをテストします:

すべてがうまくいけば、php-clamavlibはウイルスを認識し、アップロードを拒否するはずです:

6 リンク
- php-clamavlib: http://packages.debian.org/unstable/source/php-clamavlib
- PHP: http://www.php.net
- ClamAV: http://www.clamav.net
- Apache: http://httpd.apache.org
- Eicarテストウイルス: http://www.eicar.org/anti_virus_test_file.htm
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。