ウイルススキャン · 1 min read · Oct 27, 2025
php-clamavlibを使用してアップロードされたファイルを自動的にウイルススキャンする方法
php-clamavlibを使用してアップロードされたファイルを自動的にウイルススキャンする方法
バージョン 1.0
著者: Falko Timme
このガイドでは、PHPとClamAVを使用して、サーバー上のWebフォームを介してユーザーがアップロードしたファイルを自動的にスキャンする方法を説明します。これにより、アップロードフォームがマルウェアを配布するために悪用されないことを確認できます。PHPとClamAVを接続するために、現在あまり文書化されていないphp5-clamavlib/php4-clamavlibパッケージをインストールします。このパッケージは、Debian EtchおよびSid、またはUbuntu Dapper DrakeおよびEdgy Eftで利用可能ですので、これらのプラットフォームのいずれかを使用していることを確認してください。
まず最初に、このシステムを設定する方法はこれだけではないことを言いたいと思います。この目標を達成する方法はたくさんありますが、これが私が取る方法です。これがあなたにとって機能することを保証するものではありません!
1 前提条件
前述のように、システムはDebian Etch、Sid、Ubuntu Dapper Drake、またはUbuntu Edgy Eftを使用している必要があり、Apache2とPHP4またはPHP5がすでにインストールされている必要があります。
Debian Sargeを使用している場合は、backports.orgからphp-clamavlibパッケージをインストールできます: http://www.backports.org/debian/pool/main/p/php-clamavlib/
デフォルトのドキュメントルートとして/var/wwwを使用していると仮定します。サーバー上に複数のWebサイトがある場合は、ドキュメントルートをニーズに合わせて調整してください。また、この例では、サーバーのIPアドレスとして192.168.0.100を使用しています。これも調整してください。名前ベースのvhost構成で複数のWebサイトがある場合は、IPアドレスの代わりにそれぞれのドメイン/FQDNを使用してWebサイトにアクセスする必要があります。
ここでのすべての手順はrootユーザーとして実行します。したがって、rootとしてログインしていることを確認するか、Ubuntuを使用している場合は、すべてのコマンドの前にsudoを付けてください。例えば、
apt-get updateは次のようになります。
sudo apt-get update 2 /etc/apt/sources.listの修正
Ubuntu Dapper DrakeまたはUbuntu Edgy Eftを使用している場合は、/etc/apt/sources.listを修正して、universeリポジトリが有効になっていることを確認する必要があります。Debian EtchまたはSidを使用している場合は、/etc/apt/sources.listを編集しないでください。
2.1 Ubuntu Dapper Drake
/etc/apt/sources.listを編集し、次の行が含まれていることを確認します: deb http://de.archive.ubuntu.com/ubuntu/ dapper universe(de.archive.ubuntu.comを近くのUbuntuミラーに置き換えてください):
vi /etc/apt/sources.list| [...] deb http://de.archive.ubuntu.com/ubuntu/ dapper universe [...] |
その後、次のコマンドを実行します。
apt-get updateパッケージデータベースを更新します。
2.2 Ubuntu Edgy Eft
/etc/apt/sources.listを編集し、次の行が含まれていることを確認します: deb http://de.archive.ubuntu.com/ubuntu/ edgy universe(de.archive.ubuntu.comを近くのUbuntuミラーに置き換えてください):
vi /etc/apt/sources.list| [...] deb http://de.archive.ubuntu.com/ubuntu/ edgy universe [...] |
その後、次のコマンドを実行します。
apt-get updateパッケージデータベースを更新します。
3 ClamAVとphp-clamavlibのインストール
次に、ウイルススキャナーであるClamAVと、PHPとClamAVの間の接着剤を提供するphp-clamavlibパッケージをインストールします。
PHP5を使用している場合は、次のコマンドを実行します:
apt-get install php5-clamavlib clamav clamav-freshclam clamav-docs arj unzoo PHP4を使用している場合は、次のコマンドを実行します:
apt-get install php4-clamavlib clamav clamav-freshclam clamav-docs arj unzoo その後、Apacheを再起動します:
/etc/init.d/apache2 restart必要に応じて、php.ini(PHP5を使用している場合は/etc/php5/apache2/php.ini、PHP4を使用している場合は/etc/php4/apache2/php.ini)を確認して、php-clamavlibのエントリがあるかどうかを確認できます。これらは次のようになります:
vi /etc/php5/apache2/php.ini| [...] extension=clamav.so [clamav] clamav.dbpath=/var/lib/clamav clamav.maxreclevel=0 clamav.maxfiles=0 clamav.archivememlim=0 clamav.maxfilesize=0 clamav.maxratio=0 |
vi /etc/php4/apache2/php.ini| [...] extension=clamav.so [clamav] clamav.dbpath=/var/lib/clamav clamav.maxreclevel=0 clamav.maxfiles=0 clamav.archivememlim=0 clamav.maxfilesize=0 clamav.maxratio=0 |
Debian Sargeを使用している場合は、backports.orgからphp-clamavlibパッケージをインストールできます: http://www.backports.org/debian/pool/main/p/php-clamavlib/
4 php-clamavlib関数
php-clamavlibによって提供されるPHP関数に関する文書はありませんが、php-clamavlibのソースコードにclamav.phpというスクリプトがあり、どの関数が利用可能かを示しています。今、私たちは/var/wwwディレクトリに同じスクリプトを作成します:
vi /var/www/clamav.php| \n"; foreach($functions as $func) { echo $func." |
\n"; } echo "
\n"; $function = 'confirm_' . $module . '_compiled'; if (extension_loaded($module)) { $str = $function($module); } else { $str = "モジュール $module はPHPにコンパイルされていません"; } echo "$str\n"; ?>
今、ブラウザでhttp://192.168.0.100/clamav.phpにアクセスしてください。出力は次のようになります:
テスト拡張で利用可能な関数:
cl_info
cl_scanfile
cl_scanbuff
cl_setlimits
cl_scanfile_ex
cl_scanbuff_ex
cl_pretcode
clam_scan_buffer
clam_scan_file
clam_get_version
致命的なエラー: /var/www/clamav.phpの14行目で未定義の関数confirm_clamav_compiled()を呼び出しました最後の行の致命的なエラーは無視できます。
これで、どの関数が利用可能かはわかりましたが、どのパラメータが必要かはわかりません。次のページを見つけました: http://www.clamav.net/doc/0.88.4/html/node41.html これはClamAVのソースコードにおける類似の関数を説明しています。テストとそのページを読むことで、cl_info()、cl_scanfile()、cl_setlimits()、clam_get_version()の関数の使い方を見つけました。これらはアップロードされたファイルをスキャンするために必要なすべての関数です(実際にはcl_scanfile()だけで十分です)。次の章では、小さなHTMLアップロードフォームを作成し、これらの関数を使用してアップロードされたファイルをウイルススキャンします。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。