SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

JEEアプリケーションでのファイルのウイルススキャンの実装

Symantec Scan Engine 5.1を利用したJavaアプリケーションウイルス対策

ダウンロード サンプルソース (74.2 KB)

プロジェクトのセットアップ

 この記事のために、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 ― ファイルをスキャンし、感染の修復を試みます。修復できないファイルは削除します。
 ファイルストリーム(バイト列)のスキャンの場合、有効な値はSCANとNOSCANのみです。

SSEでスキャンを行うJava APIの使用

 スキャンを行うクラスでは、「av.jar」内のAVClientオブジェクトに備わっているスキャンAPIを呼び出します。AVClientオブジェクトはScan Engineサーバーへの接続を確立し、以下のAPIを含みます。

図2 Scan Engineサーバーと通信するための主なAPI
図2 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ソフトウェア開発者ガイドを参照してください。

次のページ
SSEの応答コードと通知オプション

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Vlad Kofman(Vlad Kofman)

ウォールストリート有数の企業でエンタープライズレベルのプロジェクトに携わる。また、米国政府の防衛関連の仕事も手がけている。特に関心を寄せているのは、オブジェクト指向プログラミング方法論、UI、デザインパターン。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1979 2008/01/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー