プロジェクトのセットアップ
この記事のために、Symantec SSE APIのラッパーとなる「av.jar」を用意しました。SymantecのJava APIを使用し、SSEサーバーのクライアントとして機能して、サーバーとのすべての通信を担います。「av.jar」は、本稿の冒頭のリンクからダウンロードできます。SSEに対して「av.jar」を使用するには、これをJava CLASSPATHに含める必要があります。このjarにはAVClientというクラスが含まれています。これは、SSEに対してバイト列でファイルを送信し、結果を返すという処理そのものを行うクラスです。
私のプロジェクト設定では、System.getPropertyを通じてアクセスする3つの変数を追加しています。次のような変数です。
AV_SERVER_HOST=192.168.1.150 AV_SERVER_PORT=''1344'' AV_SERVER_MODE=SCAN
AV_SERVER_HOSTはScan Engineがインストールされているマシンのホスト名またはIPです。
AV_SERVER_PORTはScan Engineが受け取るファイルをリッスンするポートです。
AV_SERVER_MODEはスキャンモードで、次のいずれかです。
- NOSCAN ― スキャンを行いません(先頭が"SCAN"以外のどのキーワードを指定しても、Scan Engineの呼び出しは無視され、ファイルの転送とスキャンは行われません)。
- SCAN ― ファイルまたはバイトストリームをスキャンしますが、感染の修復は行いません。
- SCANREPAIR ― ファイルをスキャンし、感染の修復を試みますが、それ以外の処理は行いません。
- SCANREPAIRDELETE ― ファイルをスキャンし、感染の修復を試みます。修復できないファイルは削除します。
SSEでスキャンを行うJava APIの使用
スキャンを行うクラスでは、「av.jar」内のAVClientオブジェクトに備わっているスキャンAPIを呼び出します。AVClientオブジェクトはScan Engineサーバーへの接続を確立し、以下のAPIを含みます。

スキャンの対象がファイルシステム上のファイルで、SCANモード(スキャンのみのモード)を使用する場合は、パラメータとしてファイル名のみを受け取るメソッドを呼び出します。
スキャンの対象がファイルシステム上のファイルで、SCANREPAIRモードまたはSCANREPAIRDELETEモードを使用する場合は、入力ファイル名と出力ファイル名を受け取るメソッドを呼び出します。
スキャンの対象がメモリ内のファイル(バイト列)の場合は、バイト列を受け取るメソッドを呼び出します。
サンプルコードを以下に示します。
import com.av.*;
設定パラメータを初期化します。
static String avMode = (System.getProperty("AV_SERVER_MODE") != null) ? (String) System.getProperty("AV_SERVER_MODE") : "NOSCAN"; static boolean scan = avMode.startsWith("SCAN"); static String avServer = (String) System.getProperty("AV_SERVER_HOST"); static int avPort = Integer.parseInt( (String) System.getProperty("AV_SERVER_PORT"));
メモリ内ファイルのバイト列をスキャンしてチェックする例です。
public void scanFile(byte[] fileBytes, String fileName) throws IOException, Exception { if (scan) { AVClient avc = new AVClient(avServer, avPort, avMode); if (avc.scanfile(fileName, fileBytes) == -1) { throw new VirusException("WARNING: A virus was detected in your attachment: " + fileName + "<br>Please scan your system with the latest antivirus software with updated virus definitions and try again."); } } }
MVCハンドラ内でこのコードを使用する場合は、カスタムのVirusExceptionをスローでき、呼び出し側のメソッドでこれをチェックして必要なクリーンアップ処理を実行できます。このクラスも「av.jar」に含まれています。
使用例を次に示します。
catch (Exception ex) { logger.error(ex); if (ex instanceof VirusException) { // do something here } else { // there was some other error - handle it } }
Scan EngineのクライアントAPIの詳細については、Symantec Scan Engineソフトウェア開発者ガイドを参照してください。
