--- title: "File Filter の開発" slug: "filesafer-programming-file" tags: ["api", "File Safer"] updated: 2026-09-17T09:28:45Z published: 2026-09-17T09:28:45Z canonical: "guide.ncloud-docs.com/filesafer-programming-file" stale: true --- > ## Documentation Index > Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # File Filter の開発 Classic/VPC環境で利用できます。 File Filter REST APIを使用して File Filterコードを作成する方法を説明します。 参考 File Filter開発の先に、File Saferご利用の申し込み、API Gatewayご利用の申し込みと API Keyを作成する必要があります。詳細は、[File Safer を開始する](/docs/ja/filesafer-start)をご参照ください。 ## File Filter実現のシナリオ File Filterを適用するシナリオは、次の通りです。 [1.ファイル検査リクエスト(inputFile)](/docs/ja/filesafer-programming-file#1%ED%8C%8C%EC%9D%BC%EA%B2%80%EC%82%AC%EC%9A%94%EC%B2%ADinputFile) [1-1.マルウェアが疑われるファイルを区分](/docs/ja/filesafer-programming-file#11%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C%EB%A1%9C%EC%9D%98%EC%8B%AC%EB%90%98%EB%8A%94%ED%8C%8C%EC%9D%BC%EC%9D%84%EA%B5%AC%EB%B6%84) [1-2.認証値作成](/docs/ja/filesafer-programming-file#12%EC%9D%B8%EC%A6%9D%EA%B0%92%EC%83%9D%EC%84%B1) [1-3.リクエスト Body作成](/docs/ja/filesafer-programming-file#13%EC%9A%94%EC%B2%ADBody%EC%83%9D%EC%84%B1) [1-4.リクエストパラメータ追加](/docs/ja/filesafer-programming-file#14%EC%9A%94%EC%B2%AD%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EC%B6%94%EA%B0%80) [1-5.APIリクエスト](/docs/ja/filesafer-programming-file#15API%EC%9A%94%EC%B2%AD) [2.検査結果確認(getInputFileLog)](/docs/ja/filesafer-programming-file#2%EA%B2%80%EC%82%AC%EA%B2%B0%EA%B3%BC%ED%99%95%EC%9D%B8getInputFileLog) [2-1.検査結果を確認する Hash値区分](/docs/ja/filesafer-programming-file#21%EA%B2%80%EC%82%AC%EA%B2%B0%EA%B3%BC%EB%A5%BC%ED%99%95%EC%9D%B8%ED%95%A0Hash%EA%B0%92%EA%B5%AC%EB%B6%84) [2-2.認証値作成](/docs/ja/filesafer-programming-file#22%EC%9D%B8%EC%A6%9D%EA%B0%92%EC%83%9D%EC%84%B1) [2-3.リクエストパラメータ追加](/docs/ja/filesafer-programming-file#23%EC%9A%94%EC%B2%AD%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EC%B6%94%EA%B0%80) [2-4.APIリクエスト](/docs/ja/filesafer-programming-file#24API%EC%9A%94%EC%B2%AD) [2-5.レスポンス値確認とブロック有無を判断](/docs/ja/filesafer-programming-file#25%EC%9D%91%EB%8B%B5%EA%B0%92%ED%99%95%EC%9D%B8%EB%B0%8F%EC%B0%A8%EB%8B%A8%EC%97%AC%EB%B6%80%ED%8C%90%EB%8B%A8) 参考 File Filterでマルウェアが確認される場合、Hash Filterの Hash値をアップデートするために検査結果を Hash Filterで照会しても同じ結果が得られます。 ## File Filterコード作成 [File Filter の実装シナリオ](/docs/ja/filesafer-programming-file#FileFilter%EA%B5%AC%ED%98%84%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4)に従ってコードを作成します。 ### 1.ファイル検査リクエスト(inputFile) File Filter APIの中から inputFileを使用してファイル検査をリクエストします。 参考 inputFile APIの仕様は [inputFile (File Filter)](https://api.ncloud-docs.com/docs/ja/security-filesafer-inputfile)をご参照ください。 #### 1-1.マルウェアが疑われるファイルを区分 Hash Filterで確認されないファイルや、マルウェア有無の確認が必要なファイルを区分します。ファイルの制限事項は次の通りです。 - ファイル数の制限: inputFile API呼び出し時にリクエストごとに1つのファイルのみ処理。2つ以上のファイルが転送される場合、1つのファイルのみ任意に選択して処理。 - ファイルサイズの制限: API呼び出しごとにファイル容量を10MBに制限 #### 1-2.認証値作成 NAVERクラウドプラットフォーム API使用認証に必要な IAM認証値を作成します。認証に必要なヘッダは次の通りです。 - `x-ncp-iam-access-key`: コンソールの **My Account** > **アカウントとセキュリティ管理** > **セキュリティ管理** > **アクセス管理**メニューから Access Keyを発行 - `x-ncp-apigw-signature-v2`: Access Keyとマッピングされる Secret Keyを HmacSHA256暗号化し、signature値を作成(改行文字は \nを使用) - `x-ncp-apigw-api-key`: API Gatewayで API Keyを発行 - `x-ncp-apigw-timestamp`: 認証値ではないがリクエストヘッダに含まれる。API明細を参照 参考 signature値を作成する方法とサンプルコードは、[NAVERクラウドプラットフォーム APIガイド > API の概要 > 基本 API > Ncloud API > 2.ヘッダ作成](https://api.ncloud-docs.com/docs/ja/common-ncpapi)をご参照ください。 #### 1-3.リクエスト Body作成 Multipartで Bodyにファイルを含むリクエストを作成します。 - Key: file - Value: binary #### 1-4.リクエストパラメータ追加 転送したいファイルがパスワードが設定された圧縮ファイルの場合、以下のパラメータをリクエストに追加します。 - Key: archivePassword - Value: 圧縮ファイルのパスワード String 以下は、パラメータが追加された POSTリクエスト Bodyのフォーマットです。Boundary値は、エンティティ区切り文字として使用し、boundary設定値の前には「--」を入れる必要があります。各エンティティの後尾には、crlf(「\r\n」)を使用する必要があります。 ``` Content-Type: multipart/form-data; boundary=----AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA Content-Disposition: form-data; name="file"; filename="suspicious-file.zip" Content-Type: application/x-zip-compressed ... contents of 'suspicious-file.zip' ------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA Content-Disposition: form-data; name="archivePassword" password ------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA-- ``` #### 1-5.APIリクエスト File Filter inputFile URIにリクエストを転送します。以下は inputFileリクエストのサンプルコードです。 ``` public static void request(String fileName, String password) throws Exception { String boundary = "----AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; String crlf = "\r\n"; String apiDomain = "https://filesafer.apigw.ntruss.com"; String apiURL = "/filefilter/v1/inputFile"; String method = "POST"; long timestamp = System.currentTimeMillis(); // step 2: Create Authentication Value String signature = makeSignature(method, apiURL, timestamp); // step 3: Create request with the identified file added var path = (Path) Paths.get(fileName); byte[] separator = ("--" + boundary + "\r\nContent-Disposition: form-data; name=").getBytes(StandardCharsets.UTF_8); var byteArrays = new ArrayList(); byteArrays.add(separator); byteArrays.add(("\"file\"; filename=\"" + path.getFileName() + crlf).getBytes(StandardCharsets.UTF_8)); byteArrays.add(("Content-Type: " + Files.probeContentType(path) + crlf + crlf).getBytes(StandardCharsets.UTF_8)); byteArrays.add(Files.readAllBytes(path)); byteArrays.add(crlf.getBytes(StandardCharsets.UTF_8)); // step 4: If the file you want to transfer is a zip file with a password, add the following parameters to the request if (password != null && !password.isEmpty()) { byteArrays.add(separator); byteArrays.add(("\"archivePassword\"\r\n\r\n" + password + "\r\n").getBytes(StandardCharsets.UTF_8)); } byteArrays.add(("--" + boundary + "--").getBytes(StandardCharsets.UTF_8)); // step5: Request API HttpRequest request = HttpRequest.newBuilder() .POST(BodyPublishers.ofByteArrays(byteArrays)) .uri(URI.create(apiDomain + apiURL)) .setHeader("x-ncp-apigw-timestamp", Long.toString(timestamp)) .setHeader("x-ncp-iam-access-key", ACCESSKEY) .setHeader("x-ncp-apigw-signature-v2", signature) .setHeader("x-ncp-apigw-api-key", APIKEY) .headers("Content-Type", "multipart/form-data; boundary=" + boundary) .build(); HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // Check the response value int responseCode = response.statusCode(); String responseBody = response.body().toString(); // do next step (ex, check to transfer succeeded) ... } ``` ### 2.検査結果確認(getInputFileLog) File Filter APIの中から getInputFileLogを使用してマルウェアスキャン結果を確認します。 参考 getInputFileLog APIの仕様は [getInputFileLog (File Filter)](https://api.ncloud-docs.com/docs/ja/security-filesafer-getinputfilelog)をご参照ください。 #### 2-1.検査結果を確認する Hash値区分 [ファイル検査リクエストのシナリオ](/docs/ja/filesafer-programming-file#1%ED%8C%8C%EC%9D%BC%EA%B2%80%EC%82%AC%EC%9A%94%EC%B2%ADinputFile)で File Filterに検査をリクエストしたファイルの Hash値を区分します。 #### 2-2.認証値作成 NAVERクラウドプラットフォーム API使用認証に必要な IAM認証値を作成します。認証に必要なヘッダは次の通りです。 - `x-ncp-iam-access-key`: コンソールの **My Account** > **アカウントとセキュリティ管理** > **セキュリティ管理** > **アクセス管理**メニューから Access Keyを発行 - `x-ncp-apigw-signature-v2`: Access Keyとマッピングされる Secret Keyを HmacSHA256暗号化し、signature値を作成(改行文字は \nを使用) - `x-ncp-apigw-api-key`: API Gatewayで API Keyを発行 - `x-ncp-apigw-timestamp`: 認証値ではないがリクエストヘッダに含まれる。API明細を参照 参考 signature値を作成する方法とサンプルコードは、[NAVERクラウドプラットフォーム APIガイド > API の概要 > 基本 API > Ncloud API > 2.ヘッダ作成](https://api.ncloud-docs.com/docs/ja/common-ncpapi)をご参照ください。 #### 2-3.リクエストパラメータ追加 getInputFileLog APIリクエストパラメータ値を追加します。リクエストパラメータは次の通りです。 - hashCode: Hash値を文字列に追加 - hashType: Hash値のアルゴリズムを表記(MD5または SHA-1) 以下は、作成されたパラメータの例です。 ``` hashCode=00010efc49b7174d18400710eed1642a7d4b12db&hashType=sha1 ``` #### 2-4.APIリクエスト File Filter getInputFileLog URIにリクエストを転送します。以下は、getInputFileLogリクエストのサンプルコードです。 ``` public static void main(String[] args) { String apiDomain = "https://filesafer.apigw.ntruss.com"; String method = "GET"; String apiURL = "/filefilter/v1/getInputFileLog?hashCode=FILE_HASH&hashType=sha1"; // step 3: add required parameter long timestamp = System.currentTimeMillis(); // step 2: Create Authentication Value String signature = makeSignature(method, apiURL, timestamp); // step 4: Request API URL url = new URL(apiDomain + apiURL); HttpURLConnection con = (HttpURLConnection)url.openConnection(); con.setRequestMethod(method); con.setRequestProperty("x-ncp-apigw-timestamp", Long.toString(timestamp)); con.setRequestProperty("x-ncp-iam-access-key", ACCESSKEY); // access key (from portal or sub account) con.setRequestProperty("x-ncp-apigw-signature-v2", signature); // step5: Check the response value and determine whether to block int responseCode = con.getResponseCode(); BufferedReader br = null; if(responseCode == 200) { br = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = br.readLine()) != null) { response.append(inputLine); } // do next step (ex, determine whether to block) ... br.close(); } } ``` #### 2-5.レスポンス値確認とブロック有無を判断 getInputFileLogレスポンスに応じてブロックまたは許可の有無を判断します。 `inputFileLogList`の数が0であればリクエスト結果がない場合であり、`inputFileLogList`が2つ以上であれば2回以上分析された場合を意味します。`inputFileLogList`の`analysisStatusCode`フィールド値を読み取り、検査進行状況を確認します。 | analysisStatusCodeコード | 値 | 説明 | | --- | --- | --- | | IPRG | Analyzing | 分析中 | | CMPL | Analysis completed | 分析完了 | | RDY | Ready | 分析待ち | | ERR | Analysis error | エラー | | EXCN | Exclude analysis | 例外 | `inputFileLogList`の`analysisResultCode`フィールド値を読み取り、検査結果を確認します。 | analysisResultCode | 値 | 説明 | | --- | --- | --- | | M | Malware detected | マルウェアの検知 | | N | Malware not detected | 正常なファイル | | E | Detection error | エラー | マルウェアが検出された場合はファイルをシステムから削除するか、安全に隔離します。 以下は検査分析完了ステータスでありながら、マルウェアが検出された場合のレスポンス例です。 ``` { "returnCode": "0", "returnMessage": "success", "inputFileLogList": [ { "fileType": "application/x-msdownload; format=pe32", "fileSize": 740544, "md5": "a69acb01b99959efec7c0a2a8caa7545", "sha1": "f093e7767bb63ac973b697d3fd1d40a78b87b8bf", "sha256": "470a75fe3da2ddf9d27fb3f9c96e6c665506ea7ba26ab89f0c89606f678ae4a2", "analysisStatusCode": "CMPL", "analysisResultCode": "M", "notifyYmdt": 1544005507000, "registrationYmdt": 1544005472000, "serviceCode": null, "applicationCode": null }, { "fileType": "application/x-msdownload; format=pe32", "fileSize": 740544, "md5": "a69acb01b99959efec7c0a2a8caa7545", "sha1": "f093e7767bb63ac973b697d3fd1d40a78b87b8bf", "sha256": "470a75fe3da2ddf9d27fb3f9c96e6c665506ea7ba26ab89f0c89606f678ae4a2", "analysisStatusCode": "CMPL", "analysisResultCode": "M", "notifyYmdt": 1544006407000, "registrationYmdt": 1544006150000, "serviceCode": null, "applicationCode": null }, ] } ```