민감한 정보의 이미지 검사

Cloud DLP(Data Loss Prevention)는 이미지 내의 민감한 정보를 감지 및 분류할 수 있습니다. Cloud DLP는 infoType 감지기 및 광학 문자 인식(OCR)을 사용하여 base64 인코딩 이미지의 텍스트를 검사하고 텍스트 내의 민감한 정보를 감지한 다음 감지된 민감한 정보의 위치를 반환합니다.

이미지를 입력으로 제공하면 Cloud DLP가 이미지에서 민감한 정보를 검색합니다. 검사 작업의 결과에는 발견된 infoType, 일치 가능성, Cloud DLP가 찾은 민감한 정보의 영역을 나타내는 픽셀 좌표 및 길이 값이 포함됩니다. 이미지의 왼쪽 하단 모서리에 있는 좌표는 (0,0)입니다.

모든 기본 infoType에 대한 이미지 검사

이미지에서 민감한 정보를 검사하려면 base64로 인코딩된 이미지를 DLP API의 content.inspect 메서드에 제출합니다. 검색할 구체적인 정보 유형(infoType)을 지정하지 않으면 Cloud DLP가 가장 일반적인 infoType을 검색합니다.

이미지에서 기본 infoType을 검사하려면 다음 절차를 따르세요.

  1. 이미지를 base64로 인코딩합니다.
  2. DLP API의 content.inspect 메서드에 요청을 제출합니다. 기본 infoType을 검사하려는 경우 요청에 base64 인코딩 이미지만 포함되어야 합니다.

예를 들어 다음 이미지를 살펴보겠습니다. 이 이미지는 종이 문서를 스캔한 후 생성된 일반적인 이미지 파일의 예시입니다.

원본 이미지(확대하려면 클릭)

이 이미지를 기본 infoType에 대해 검사하려면 DLP API의 content.inspect 메서드로 다음 요청을 보냅니다.

프로토콜

{
  "item": {
    "byteItem": {
      "data": "[BASE64-ENCODED-IMAGE]",
      "type": "IMAGE_JPEG"
    }
  }
}

Cloud DLP는 다음을 반환합니다.

{
  "result": {
    "findings": [
      {
        "infoType": {
          "name": "PHONE_NUMBER"
        },
        "likelihood": "UNLIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 98,
                    "left": 986,
                    "width": 102,
                    "height": 117
                  },
                  {
                    "top": 98,
                    "left": 1092,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 95,
                    "left": 1111,
                    "width": 82,
                    "height": 115
                  },
                  {
                    "top": 95,
                    "left": 1197,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 90,
                    "left": 1203,
                    "width": 185,
                    "height": 118
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:07:05.870Z"
      },
      {
        "infoType": {
          "name": "US_SOCIAL_SECURITY_NUMBER"
        },
        "likelihood": "VERY_LIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 98,
                    "left": 986,
                    "width": 102,
                    "height": 117
                  },
                  {
                    "top": 98,
                    "left": 1092,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 95,
                    "left": 1111,
                    "width": 82,
                    "height": 115
                  },
                  {
                    "top": 95,
                    "left": 1197,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 90,
                    "left": 1203,
                    "width": 185,
                    "height": 118
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:07:05.871Z"
      },
      {
        "infoType": {
          "name": "EMAIL_ADDRESS"
        },
        "likelihood": "LIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 340,
                    "left": 334,
                    "width": 57,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 384,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 387,
                    "width": 79,
                    "height": 59
                  },
                  {
                    "top": 341,
                    "left": 467,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 476,
                    "width": 119,
                    "height": 61
                  },
                  {
                    "top": 341,
                    "left": 589,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 342,
                    "left": 592,
                    "width": 45,
                    "height": 58
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:07:05.869Z"
      },
      {
        "infoType": {
          "name": "PHONE_NUMBER"
        },
        "likelihood": "POSSIBLE",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 394,
                    "left": 335,
                    "width": 50,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 380,
                    "width": 17,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 387,
                    "width": 51,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 433,
                    "width": 17,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 436,
                    "width": 77,
                    "height": 77
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:07:05.870Z"
      },
      {
        "infoType": {
          "name": "DATE"
        },
        "likelihood": "LIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 572,
                    "left": 1129,
                    "width": 71,
                    "height": 38
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:07:05.921Z"
      }
    ]
  }
}

자바


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ByteContentItem;
import com.google.privacy.dlp.v2.ByteContentItem.BytesType;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.LocationName;
import com.google.protobuf.ByteString;
import java.io.FileInputStream;
import java.io.IOException;

class InspectImageFileAllInfoTypes {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "my-project-id";
    String inputPath = "src/test/resources/sensitive-data-image.jpeg";
    inspectImageFileAllInfoTypes(projectId, inputPath);
  }

  static void inspectImageFileAllInfoTypes(String projectId, String inputPath)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify the content to be inspected.
      ByteString fileBytes = ByteString.readFrom(new FileInputStream(inputPath));
      ByteContentItem byteItem =
          ByteContentItem.newBuilder().setType(BytesType.IMAGE_JPEG).setData(fileBytes).build();

      // Construct the Inspect request to be sent by the client.
      // Do not specify the type of info to inspect.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(ContentItem.newBuilder().setByteItem(byteItem).build())
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results.
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

Cloud DLP는 다음 infoType을 찾았으나 각 infoType의 일치 신뢰도는 경우에 따라 다릅니다.

  • 전화번호 (낮은 가능성)
  • 미국 사회 보장 번호 (매우 높은 가능성)
  • 이메일 주소 (높은 가능성)
  • 전화번호 (어느 정도 가능)
  • 날짜 (높은 가능성)

이미지에서 각 경계 상자를 그리면 다음과 같이 표시됩니다. Cloud DLP는 종종 여러 상자를 사용하여 이미지에서 민감한 정보의 단일 인스턴스 위치를 나타냅니다.

이미지에 오버레이된 경계 상자 (확대하려면 클릭)

위의 이미지에서 Cloud DLP는 필기 입력된 주민등록번호, 이메일 주소, 전화번호를 마스킹하는 것 외에 연도도 수정했습니다. 최적의 동작이 아니라고 가정하고 다음 예시에서는 특정 infoType만 검사하는 방법을 보여줍니다.

특정 infoType에 대한 이미지 검사

이미지에서 특정 민감한 정보 유형만 검사하려면 해당하는 기본 제공 infoType을 지정합니다.

이미지에서 기본 infoType을 검사하려면 다음 절차를 따르세요.

  1. 이미지를 base64로 인코딩합니다.
  2. DLP API의 content.inspect 메서드에 요청을 제출합니다. 요청에는 다음이 포함되어야 합니다.

이전 섹션의 원본 이미지를 다시 살펴보겠습니다. 주민등록번호, 이메일 주소, 전화번호를 조사하려면 다음 JSON을 DLP API의 content.inspect 메서드에 제출합니다.

프로토콜

{
  "item": {
    "byteItem": {
      "data": "[BASE64-ENCODED-IMAGE]",
      "type": "IMAGE_JPEG"
    }
  },
  "inspectConfig": {
    "infoTypes": [
      {
        "name": "US_SOCIAL_SECURITY_NUMBER"
      },
      {
        "name": "PHONE_NUMBER"
      },
      {
        "name": "EMAIL_ADDRESS"
      }
    ]
  }
}

Cloud DLP는 다음을 반환합니다.

{
  "result": {
    "findings": [
      {
        "infoType": {
          "name": "US_SOCIAL_SECURITY_NUMBER"
        },
        "likelihood": "VERY_LIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 98,
                    "left": 986,
                    "width": 102,
                    "height": 117
                  },
                  {
                    "top": 98,
                    "left": 1092,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 95,
                    "left": 1111,
                    "width": 82,
                    "height": 115
                  },
                  {
                    "top": 95,
                    "left": 1197,
                    "width": 29,
                    "height": 114
                  },
                  {
                    "top": 90,
                    "left": 1203,
                    "width": 185,
                    "height": 118
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:58:56.985Z"
      },
      {
        "infoType": {
          "name": "EMAIL_ADDRESS"
        },
        "likelihood": "LIKELY",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 340,
                    "left": 334,
                    "width": 57,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 384,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 387,
                    "width": 79,
                    "height": 59
                  },
                  {
                    "top": 341,
                    "left": 467,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 340,
                    "left": 476,
                    "width": 119,
                    "height": 61
                  },
                  {
                    "top": 341,
                    "left": 589,
                    "width": 12,
                    "height": 58
                  },
                  {
                    "top": 342,
                    "left": 592,
                    "width": 45,
                    "height": 58
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:58:56.984Z"
      },
      {
        "infoType": {
          "name": "PHONE_NUMBER"
        },
        "likelihood": "POSSIBLE",
        "location": {
          "contentLocations": [
            {
              "imageLocation": {
                "boundingBoxes": [
                  {
                    "top": 394,
                    "left": 335,
                    "width": 50,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 380,
                    "width": 17,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 387,
                    "width": 51,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 433,
                    "width": 17,
                    "height": 77
                  },
                  {
                    "top": 394,
                    "left": 436,
                    "width": 77,
                    "height": 77
                  }
                ]
              }
            }
          ]
        },
        "createTime": "2019-11-01T22:58:56.985Z"
      }
    ]
  }
}

자바


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ByteContentItem;
import com.google.privacy.dlp.v2.ByteContentItem.BytesType;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.LocationName;
import com.google.protobuf.ByteString;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class InspectImageFileListedInfoTypes {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "my-project-id";
    String inputPath = "src/test/resources/sensitive-data-image.jpeg";
    inspectImageFileListedInfoTypes(projectId, inputPath);
  }

  static void inspectImageFileListedInfoTypes(String projectId, String inputPath)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify the content to be inspected.
      ByteString fileBytes = ByteString.readFrom(new FileInputStream(inputPath));
      ByteContentItem byteItem =
          ByteContentItem.newBuilder().setType(BytesType.IMAGE_JPEG).setData(fileBytes).build();

      // Specify the type of info the inspection will look for.
      List<InfoType> infoTypes = new ArrayList<>();
      // See https://cloud.google.com/dlp/docs/infotypes-reference for complete list of info types
      for (String typeName :
          new String[] {"US_SOCIAL_SECURITY_NUMBER", "EMAIL_ADDRESS", "PHONE_NUMBER"}) {
        infoTypes.add(InfoType.newBuilder().setName(typeName).build());
      }

      // Construct the configuration for the Inspect request.
      InspectConfig inspectConfig =
          InspectConfig.newBuilder()
              .addAllInfoTypes(infoTypes)
              .build();

      // Construct the Inspect request to be sent by the client.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(ContentItem.newBuilder().setByteItem(byteItem).build())
              .setInspectConfig(inspectConfig)
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results.
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

출력에서 볼 수 있듯이 Cloud DLP가 미국 사회보장번호, 이메일 주소, 전화번호를 확인했습니다.

JSON과 Cloud DLP API 사용법에 대한 자세한 내용은 JSON 빠른 시작을 참조하세요.

코드 예시

다음은 Cloud DLP를 사용하여 이미지에서 민감한 정보를 검사하는 방법을 보여주는 여러 언어로 된 샘플 코드입니다.

Node.js

// Imports the Google Cloud Data Loss Prevention library
const DLP = require('@google-cloud/dlp');

// Import other required libraries
const fs = require('fs');
const mime = require('mime');

// Instantiates a client
const dlp = new DLP.DlpServiceClient();

// The project ID to run the API call under
// const projectId = 'my-project';

// The path to a local file to inspect. Can be a text, JPG, or PNG file.
// const filepath = 'path/to/image.png';

// The minimum likelihood required before returning a match
// const minLikelihood = 'LIKELIHOOD_UNSPECIFIED';

// The maximum number of findings to report per request (0 = server maximum)
// const maxFindings = 0;

// The infoTypes of information to match
// const infoTypes = [{ name: 'PHONE_NUMBER' }, { name: 'EMAIL_ADDRESS' }, { name: 'CREDIT_CARD_NUMBER' }];

// The customInfoTypes of information to match
// const customInfoTypes = [{ infoType: { name: 'DICT_TYPE' }, dictionary: { wordList: { words: ['foo', 'bar', 'baz']}}},
//   { infoType: { name: 'REGEX_TYPE' }, regex: '\\(\\d{3}\\) \\d{3}-\\d{4}'}];

// Whether to include the matching string
// const includeQuote = true;

async function inspectFile() {
  // Construct file data to inspect
  const fileTypeConstant =
    ['image/jpeg', 'image/bmp', 'image/png', 'image/svg'].indexOf(
      mime.getType(filepath)
    ) + 1;
  const fileBytes = Buffer.from(fs.readFileSync(filepath)).toString('base64');
  const item = {
    byteItem: {
      type: fileTypeConstant,
      data: fileBytes,
    },
  };

  // Construct request
  const request = {
    parent: `projects/${projectId}/locations/global`,
    inspectConfig: {
      infoTypes: infoTypes,
      customInfoTypes: customInfoTypes,
      minLikelihood: minLikelihood,
      includeQuote: includeQuote,
      limits: {
        maxFindingsPerRequest: maxFindings,
      },
    },
    item: item,
  };

  // Run request
  const [response] = await dlp.inspectContent(request);
  const findings = response.result.findings;
  if (findings.length > 0) {
    console.log('Findings:');
    findings.forEach(finding => {
      if (includeQuote) {
        console.log(`\tQuote: ${finding.quote}`);
      }
      console.log(`\tInfo type: ${finding.infoType.name}`);
      console.log(`\tLikelihood: ${finding.likelihood}`);
    });
  } else {
    console.log('No findings.');
  }
}

Python



def inspect_file(
    project,
    filename,
    info_types,
    min_likelihood=None,
    custom_dictionaries=None,
    custom_regexes=None,
    max_findings=None,
    include_quote=True,
    mime_type=None,
):
    """Uses the Data Loss Prevention API to analyze a file for protected data.
    Args:
        project: The Google Cloud project id to use as a parent resource.
        filename: The path to the file to inspect.
        info_types: A list of strings representing info types to look for.
            A full list of info type categories can be fetched from the API.
        min_likelihood: A string representing the minimum likelihood threshold
            that constitutes a match. One of: 'LIKELIHOOD_UNSPECIFIED',
            'VERY_UNLIKELY', 'UNLIKELY', 'POSSIBLE', 'LIKELY', 'VERY_LIKELY'.
        max_findings: The maximum number of findings to report; 0 = no maximum.
        include_quote: Boolean for whether to display a quote of the detected
            information in the results.
        mime_type: The MIME type of the file. If not specified, the type is
            inferred via the Python standard library's mimetypes module.
    Returns:
        None; the response from the API is printed to the terminal.
    """

    import mimetypes

    # Import the client library.
    import google.cloud.dlp

    # Instantiate a client.
    dlp = google.cloud.dlp_v2.DlpServiceClient()

    # Prepare info_types by converting the list of strings into a list of
    # dictionaries (protos are also accepted).
    if not info_types:
        info_types = ["FIRST_NAME", "LAST_NAME", "EMAIL_ADDRESS"]
    info_types = [{"name": info_type} for info_type in info_types]

    # Prepare custom_info_types by parsing the dictionary word lists and
    # regex patterns.
    if custom_dictionaries is None:
        custom_dictionaries = []
    dictionaries = [
        {
            "info_type": {"name": "CUSTOM_DICTIONARY_{}".format(i)},
            "dictionary": {"word_list": {"words": custom_dict.split(",")}},
        }
        for i, custom_dict in enumerate(custom_dictionaries)
    ]
    if custom_regexes is None:
        custom_regexes = []
    regexes = [
        {
            "info_type": {"name": "CUSTOM_REGEX_{}".format(i)},
            "regex": {"pattern": custom_regex},
        }
        for i, custom_regex in enumerate(custom_regexes)
    ]
    custom_info_types = dictionaries + regexes

    # Construct the configuration dictionary. Keys which are None may
    # optionally be omitted entirely.
    inspect_config = {
        "info_types": info_types,
        "custom_info_types": custom_info_types,
        "min_likelihood": min_likelihood,
        "limits": {"max_findings_per_request": max_findings},
    }

    # If mime_type is not specified, guess it from the filename.
    if mime_type is None:
        mime_guess = mimetypes.MimeTypes().guess_type(filename)
        mime_type = mime_guess[0]

    # Select the content type index from the list of supported types.
    supported_content_types = {
        None: 0,  # "Unspecified"
        "image/jpeg": 1,
        "image/bmp": 2,
        "image/png": 3,
        "image/svg": 4,
        "text/plain": 5,
    }
    content_type_index = supported_content_types.get(mime_type, 0)

    # Construct the item, containing the file's byte data.
    with open(filename, mode="rb") as f:
        item = {"byte_item": {"type": content_type_index, "data": f.read()}}

    # Convert the project id into a full resource id.
    parent = f"projects/{project}"

    # Call the API.
    response = dlp.inspect_content(
        request={"parent": parent, "inspect_config": inspect_config, "item": item}
    )

    # Print out the results.
    if response.result.findings:
        for finding in response.result.findings:
            try:
                print("Quote: {}".format(finding.quote))
            except AttributeError:
                pass
            print("Info type: {}".format(finding.info_type.name))
            print("Likelihood: {}".format(finding.likelihood))
    else:
        print("No findings.")

Go

import (
	"context"
	"fmt"
	"io"
	"io/ioutil"

	dlp "cloud.google.com/go/dlp/apiv2"
	dlppb "google.golang.org/genproto/googleapis/privacy/dlp/v2"
)

// inspectTextFile inspects a text file at a given filePath, and prints results.
func inspectTextFile(w io.Writer, projectID, filePath string) error {
	// projectID := "my-project-id"
	// filePath := "path/to/image.png"
	ctx := context.Background()

	// Initialize client.
	client, err := dlp.NewClient(ctx)
	if err != nil {
		return err
	}
	defer client.Close() // Closing the client safely cleans up background resources.

	// Gather the resources for the request.
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		return err
	}

	// Create and send the request.
	req := &dlppb.InspectContentRequest{
		Parent: fmt.Sprintf("projects/%s/locations/global", projectID),
		Item: &dlppb.ContentItem{
			DataItem: &dlppb.ContentItem_ByteItem{
				ByteItem: &dlppb.ByteContentItem{
					Type: dlppb.ByteContentItem_TEXT_UTF8,
					Data: data,
				},
			},
		},
		InspectConfig: &dlppb.InspectConfig{
			InfoTypes: []*dlppb.InfoType{
				{Name: "PHONE_NUMBER"},
				{Name: "EMAIL_ADDRESS"},
				{Name: "CREDIT_CARD_NUMBER"},
			},
			IncludeQuote: true,
		},
	}
	resp, err := client.InspectContent(ctx, req)
	if err != nil {
		return fmt.Errorf("InspectContent: %v", err)
	}

	// Process the results.
	fmt.Fprintf(w, "Findings: %d\n", len(resp.Result.Findings))
	for _, f := range resp.Result.Findings {
		fmt.Fprintf(w, "\tQoute: %s\n", f.Quote)
		fmt.Fprintf(w, "\tInfo type: %s\n", f.InfoType.Name)
		fmt.Fprintf(w, "\tLikelihood: %s\n", f.Likelihood)
	}
	return nil
}

PHP

use Google\Cloud\Dlp\V2\DlpServiceClient;
use Google\Cloud\Dlp\V2\ContentItem;
use Google\Cloud\Dlp\V2\InfoType;
use Google\Cloud\Dlp\V2\InspectConfig;
use Google\Cloud\Dlp\V2\ByteContentItem;
use Google\Cloud\Dlp\V2\ByteContentItem\BytesType;
use Google\Cloud\Dlp\V2\Likelihood;

/** Uncomment and populate these variables in your code */
// $projectId = 'YOUR_PROJECT_ID';
// $filepath = 'path/to/image.png';

// Instantiate a client.
$dlp = new DlpServiceClient();

// Get the bytes of the file
$fileBytes = (new ByteContentItem())
    ->setType(BytesType::IMAGE_PNG)
    ->setData(file_get_contents($filepath));

// Construct request
$parent = "projects/$projectId/locations/global";
$item = (new ContentItem())
    ->setByteItem($fileBytes);
$inspectConfig = (new InspectConfig())
    // The infoTypes of information to match
    ->setInfoTypes([
        (new InfoType())->setName('PHONE_NUMBER'),
        (new InfoType())->setName('EMAIL_ADDRESS'),
        (new InfoType())->setName('CREDIT_CARD_NUMBER')
    ])
    // Whether to include the matching string
    ->setIncludeQuote(true);

// Run request
$response = $dlp->inspectContent([
    'parent' => $parent,
    'inspectConfig' => $inspectConfig,
    'item' => $item
]);

// Print the results
$findings = $response->getResult()->getFindings();
if (count($findings) == 0) {
    print('No findings.' . PHP_EOL);
} else {
    print('Findings:' . PHP_EOL);
    foreach ($findings as $finding) {
        print('  Quote: ' . $finding->getQuote() . PHP_EOL);
        print('  Info type: ' . $finding->getInfoType()->getName() . PHP_EOL);
        $likelihoodString = Likelihood::name($finding->getLikelihood());
        print('  Likelihood: ' . $likelihoodString . PHP_EOL);
    }
}

Ruby

# project_id   = "Your Google Cloud project ID"
# filename     = "The file path to the file to inspect"
# max_findings = "Maximum number of findings to report per request (0 = server maximum)"

require "google/cloud/dlp"

dlp = Google::Cloud::Dlp.dlp_service
inspect_config = {
  # The types of information to match
  info_types:     [{ name: "PERSON_NAME" }, { name: "PHONE_NUMBER" }],

  # Only return results above a likelihood threshold (0 for all)
  min_likelihood: :POSSIBLE,

  # Limit the number of findings (0 for no limit)
  limits:         { max_findings_per_request: max_findings },

  # Whether to include the matching string in the response
  include_quote:  true
}

# The item to inspect
file = File.open filename, "rb"
item_to_inspect = { byte_item: { type: :BYTES_TYPE_UNSPECIFIED, data: file.read } }

# Run request
parent = "projects/#{project_id}/locations/global"
response = dlp.inspect_content parent:         parent,
                               inspect_config: inspect_config,
                               item:           item_to_inspect

# Print the results
if response.result.findings.empty?
  puts "No findings"
else
  response.result.findings.each do |finding|
    puts "Quote:      #{finding.quote}"
    puts "Info type:  #{finding.info_type.name}"
    puts "Likelihood: #{finding.likelihood}"
  end
end

C#


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;
using Google.Protobuf;
using static Google.Cloud.Dlp.V2.ByteContentItem.Types;

public class DlpInspectFile
{
    public static IEnumerable<Finding> InspectFile(string projectId, string filePath, BytesType fileType)
    {
        // Instantiate a client.
        var dlp = DlpServiceClient.Create();

        // Get the bytes from the file.
        ByteString fileBytes;
        using (Stream f = new FileStream(filePath, FileMode.Open))
        {
            fileBytes = ByteString.FromStream(f);
        }

        // Construct a request.
        var request = new InspectContentRequest
        {
            Parent = new LocationName(projectId, "global").ToString(),
            Item = new ContentItem
            {
                ByteItem = new ByteContentItem()
                {
                    Data = fileBytes,
                    Type = fileType
                }
            },
            InspectConfig = new InspectConfig
            {
                // The info types of information to match
                InfoTypes =
                {
                    new InfoType { Name = "PHONE_NUMBER" },
                    new InfoType { Name = "EMAIL_ADDRESS" },
                    new InfoType { Name = "CREDIT_CARD_NUMBER" }
                },
                // The minimum likelihood before returning a match
                MinLikelihood = Likelihood.Unspecified,
                // Whether to include the matching string
                IncludeQuote = true,
                Limits = new InspectConfig.Types.FindingLimits
                {
                    // The maximum number of findings to report per request
                    // (0 = server maximum)
                    MaxFindingsPerRequest = 0
                }
            }
        };

        // Execute request
        var response = dlp.InspectContent(request);

        // Inspect response
        var findings = response.Result.Findings;
        if (findings.Any())
        {
            Console.WriteLine("Findings:");
            foreach (var finding in findings)
            {
                Console.WriteLine($"Quote: {finding.Quote}");
                Console.WriteLine($"InfoType: {finding.InfoType}");
                Console.WriteLine($"Likelihood: {finding.Likelihood}");
            }
        }
        else
        {
            Console.WriteLine("No findings.");
        }
        return findings;
    }
}

사용해 보기

content.inspect의 참조 페이지에서 API 탐색기로 다음 각 예를 직접 시도하거나 자체 이미지로 실험해 볼 수 있습니다.

API 탐색기로 이동

다음 단계