SafetyNet Safe Browsing API

SafetyNet Google Safe Browsing API ซึ่งเป็นไลบรารีที่ขับเคลื่อนโดย บริการ Google Play, มีบริการสำหรับระบุว่า Google ได้ทำเครื่องหมาย URL ว่าเป็น ภัยคุกคามที่ทราบหรือไม่

แอปของคุณสามารถใช้ API นี้เพื่อระบุว่า Google ได้จัดประเภท URL ที่เฉพาะเจาะจงว่าเป็นภัยคุกคามที่ทราบหรือไม่ ภายใน SafetyNet จะใช้ไคลเอ็นต์สำหรับโปรโตคอลเครือข่าย Google Safe Browsing v4 ที่พัฒนาโดย Google ทั้งโค้ดไคลเอ็นต์และโปรโตคอลเครือข่าย v4 ได้รับการออกแบบมาเพื่อรักษาความเป็นส่วนตัวของผู้ใช้ รวมถึงลดการใช้แบตเตอรี่และแบนด์วิดท์ให้เหลือน้อยที่สุด ใช้ API นี้เพื่อใช้ประโยชน์จากบริการ Google Safe Browsing บน Android อย่างเต็มที่ด้วยวิธีที่ปรับทรัพยากรให้เหมาะสมที่สุด และไม่ต้องใช้โปรโตคอลเครือข่ายของบริการ

การอัปเดต เวอร์ชัน 5 (v5) ใหม่นี้มีการปรับปรุงที่สำคัญในด้านความสดใหม่ของข้อมูลและความเป็นส่วนตัวผ่านการใช้ Oblivious HTTP

เอกสารนี้อธิบายวิธีใช้ SafetyNet Google Safe Browsing Lookup API เพื่อตรวจสอบ URL หาภัยคุกคามที่ทราบ

ข้อกำหนดในการให้บริการ

การใช้ Google Safe Browsing API แสดงว่าคุณยินยอมที่จะผูกพันตาม ข้อกำหนดในการให้บริการ โปรดอ่านและทำความเข้าใจข้อกำหนดและนโยบายที่เกี่ยวข้องทั้งหมดก่อนเข้าถึง Google Safe Browsing API

ขอและลงทะเบียนคีย์ API ของ Android

สร้างและลงทะเบียนคีย์ API ของ Android ก่อนใช้ Google Safe Browsing API ดูขั้นตอนเฉพาะได้ที่หน้า เริ่มต้นใช้งาน Google Safe Browsing

ใน v5 คุณจะต้องระบุคีย์ API นี้เมื่อสร้างอินสแตนซ์ SafeBrowsingClient

เพิ่มทรัพยากร Dependency ของ SafetyNet API

เพิ่ม SafetyNet API ลงในโปรเจ็กต์ก่อนใช้ Google Safe Browsing API หากใช้ Android Studio ให้เพิ่มทรัพยากร Dependency นี้ลงในไฟล์ Gradle ระดับแอป ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ ป้องกันภัยคุกคามความปลอดภัยด้วย SafetyNet

เริ่มต้น API

หากต้องการใช้ Google Safe Browsing API คุณต้องเริ่มต้น API โดยเรียกใช้ initSafeBrowsing และรอให้การดำเนินการเสร็จสมบูรณ์ ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่าง

Kotlin

Tasks.await(SafetyNet.getClient(this).initSafeBrowsing)

Java

Tasks.await(SafetyNet.getClient(this).initSafeBrowsing);

ใน v5, GmsCore มีไคลเอ็นต์ Google Safe Browsing คุณต้องรับอินสแตนซ์ SafeBrowsingClient เราได้ปรับปรุงพื้นผิว API เพื่อเพิ่มประสิทธิภาพและลดความซับซ้อน

// Draft interface for the new client
public interface SafeBrowsingClient extends HasApiKey<SafeBrowsingApiOptions> {
  Task<SafeBrowsingResponse> lookupUri(String uri, @ThreatType List<Integer> threatTypes, @Protocol int protocol);
  Task<SupportedThreatTypesResponse> getSupportedThreatTypes();
}

ขอตรวจสอบ URL

ใช้เมธอด lookupUri เพื่อตรวจสอบว่า URI ก่อให้เกิดภัยคุกคามหรือไม่ คุณต้องระบุโปรโตคอลที่ต้องการ ซึ่งอาจเป็นรายการบล็อกในเครื่อง (v4) หรือการป้องกันแบบเรียลไทม์ (v5)

ส่งคำขอตรวจสอบ URL

API ไม่ขึ้นอยู่กับ Scheme ที่ใช้ คุณจึงส่ง URL พร้อม Scheme หรือไม่ก็ได้ ตัวอย่างเช่น ทั้ง

Kotlin

var url = "https://www.google.com"

Java

String url = "https://www.google.com";

และ

Kotlin

var url = "www.google.com"

Java

String url = "www.google.com";

ใช้ได้

โค้ดต่อไปนี้แสดงวิธีส่งคำขอตรวจสอบ URL

Kotlin

SafetyNet.getClient(this).lookupUri(
       url,
       SAFE_BROWSING_API_KEY,
       SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
       SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING
)
       .addOnSuccessListener(this) { sbResponse ->
           // Indicates communication with the service was successful.
           // Identify any detected threats.
           if (sbResponse.detectedThreats.isEmpty()) {
               // No threats found.
           } else {
               // Threats found!
           }
       }
       .addOnFailureListener(this) { e: Exception ->
           if (e is ApiException) {
               // An error with the Google Play services API contains some
               // additional details.
               Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")

               // Note: If the status code, s.statusCode,
               // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
               // you need to call initSafeBrowsing(). It means either you
               // haven't called initSafeBrowsing() before or that it needs
               // to be called again due to an internal error.
           } else {
               // A different, unknown type of error occurred.
               Log.d(TAG, "Error: ${e.message}")
           }
       }

Java

SafetyNet.getClient(this).lookupUri(url,
         SAFE_BROWSING_API_KEY,
         SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
         SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING)
   .addOnSuccessListener(this,
       new OnSuccessListener<SafetyNetApi.SafeBrowsingResponse>() {
           @Override
           public void onSuccess(SafetyNetApi.SafeBrowsingResponse sbResponse) {
               // Indicates communication with the service was successful.
               // Identify any detected threats.
               if (sbResponse.getDetectedThreats().isEmpty()) {
                   // No threats found.
               } else {
                   // Threats found!
               }
        }
   })
   .addOnFailureListener(this, new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               // An error occurred while communicating with the service.
               if (e instanceof ApiException) {
                   // An error with the Google Play services API contains some
                   // additional details.
                   ApiException apiException = (ApiException) e;
                   Log.d(TAG, "Error: " + CommonStatusCodes
                       .getStatusCodeString(apiException.getStatusCode()));

                   // Note: If the status code, apiException.getStatusCode(),
                   // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
                   // you need to call initSafeBrowsing(). It means either you
                   // haven't called initSafeBrowsing() before or that it needs
                   // to be called again due to an internal error.
               } else {
                   // A different, unknown type of error occurred.
                   Log.d(TAG, "Error: " + e.getMessage());
               }
           }
   });

ลายเซ็น lookupUri ที่อัปเดตแล้วจะใช้ URI, รายการประเภทภัยคุกคาม และโปรโตคอล

val threatTypes = listOf(ThreatType.TYPE_SOCIAL_ENGINEERING, ThreatType.TYPE_MALWARE)
val protocol = Protocol.REAL_TIME // or Protocol.LOCAL_BLOCK_LIST

safeBrowsingClient.lookupUri(url, threatTypes, protocol)
    .addOnSuccessListener { response ->
        if (response.detectedThreats.isEmpty()) {
            // No threats found
        } else {
            // Threats detected!
        }
    }

อ่านคำตอบการตรวจสอบ URL

ใช้ออบเจ็กต์ที่แสดงผล SafetyNetApi.SafeBrowsingResponse แล้วเรียกใช้เมธอด getDetectedThreats ซึ่งจะแสดงผลรายการออบเจ็กต์ SafeBrowsingThreat หากรายการที่แสดงผลว่างเปล่า แสดงว่า API ไม่พบภัยคุกคามที่ทราบ หากรายการไม่ว่างเปล่า ให้เรียกใช้ getThreatType ในแต่ละองค์ประกอบในรายการเพื่อระบุว่า API ตรวจพบภัยคุกคามที่ทราบประเภทใด

หากต้องการดูภาษาคำเตือนที่แนะนำ โปรดดู คู่มือสำหรับนักพัฒนาซอฟต์แวร์ Safe Browsing API

ระบุประเภทภัยคุกคามที่สนใจ

ค่าคงที่ในคลาส SafeBrowsingThreat มีประเภทภัยคุกคามที่รองรับในปัจจุบัน ดังนี้

ประเภทภัยคุกคาม คำจำกัดความ
TYPE_POTENTIALLY_HARMFUL_APPLICATION ประเภทภัยคุกคามนี้ระบุ URL ของหน้าที่มีการแจ้งว่ามีแอปพลิเคชันที่อาจเป็นอันตราย
TYPE_SOCIAL_ENGINEERING ประเภทภัยคุกคามนี้ระบุ URL ของหน้าที่มีการแจ้งว่ามีภัยคุกคามจากวิศวกรรมสังคม

เมื่อใช้ API คุณจะต้องเพิ่มค่าคงที่ประเภทภัยคุกคามเป็นอาร์กิวเมนต์ คุณสามารถเพิ่มค่าคงที่ประเภทภัยคุกคามได้มากเท่าที่แอปต้องการ แต่ใช้ได้เฉพาะค่าคงที่ที่ไม่ได้ทำเครื่องหมายว่าเลิกใช้งานแล้ว

ปิดเซสชัน Google Safe Browsing

หากแอปไม่จำเป็นต้องใช้ Google Safe Browsing API เป็นระยะเวลานาน ให้ตรวจสอบ URL ที่จำเป็นทั้งหมดภายในแอป แล้วปิดเซสชัน Google Safe Browsing โดยใช้ shutdownSafeBrowsing เมธอดดังนี้

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

เราขอแนะนำให้คุณเรียกใช้ shutdownSafeBrowsing ใน เมธอด onPause ของกิจกรรม และเรียกใช้ initSafeBrowsing ในเมธอด onResume ของกิจกรรม อย่างไรก็ตาม โปรดตรวจสอบว่า initSafeBrowsing ทำงานเสร็จแล้วก่อนที่จะ เรียกใช้ lookupUri การตรวจสอบว่าเซสชันของคุณเป็นเซสชันใหม่เสมอจะช่วยลดโอกาสที่จะเกิดข้อผิดพลาดภายในในแอป

รายละเอียดการป้องกันแบบเรียลไทม์

การอัปเดต v5 มีโหมดการป้องกันแบบเรียลไทม์ ซึ่งช่วยหลีกเลี่ยงปัญหาข้อมูลล้าสมัย (ซึ่งอาจนานถึง 20-50 นาทีใน v4) โดยเปลี่ยนจากโปรโตคอลอนุญาตโดยค่าเริ่มต้น เป็นโปรโตคอลตรวจสอบโดยค่าเริ่มต้น ซึ่งจะช่วยเพิ่มการป้องกันภัยคุกคามที่แพร่กระจายอย่างรวดเร็ว ในโหมดเรียลไทม์ ไคลเอ็นต์จะเก็บรักษาฐานข้อมูลในเครื่องและแคชส่วนกลางของเว็บไซต์ที่น่าจะปลอดภัย เพื่อให้การป้องกันแบบเกือบเรียลไทม์ด้วยข้อมูลภัยคุกคามล่าสุด

ประเภทภัยคุกคามที่รองรับ

API ช่วยให้คุณเลือกประเภทภัยคุกคามที่สำคัญต่อความต้องการของคุณได้ API v5 รองรับประเภทภัยคุกคามที่หลากหลายมากขึ้น ดังนี้

ค่าคงที่ประเภทภัยคุกคาม คำอธิบาย
NO_THREAT ไม่มีภัยคุกคาม
TYPE_MALWARE ภัยคุกคามจากมัลแวร์ทั่วไป
TYPE_UNWANTED_SOFTWARE ซอฟต์แวร์หรือแอปพลิเคชันไม่พึงประสงค์
TYPE_POTENTIALLY_HARMFUL_APPLICATION แอปที่อาจเป็นอันตรายต่ออุปกรณ์หรือผู้ใช้
TYPE_SOCIAL_ENGINEERING เว็บไซต์ฟิชชิงและเว็บไซต์หลอกลวงอื่นๆ
TYPE_TRICK_TO_BILL หน้าเว็บที่หลอกให้ผู้ใช้ดำเนินการเรียกเก็บเงิน
TYPE_BETTER_ADS_VIOLATION เว็บไซต์ที่ละเมิดมาตรฐานโฆษณาที่ดีกว่า
TYPE_MALWARE_OFFLINE มัลแวร์ออฟไลน์
TYPE_ABUSIVE_EXPERIENCE_VIOLATION การละเมิดที่ส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี
TYPE_HIGH_CONFIDENCE_ALLOW_LIST รายการที่อนุญาตที่มีความเชื่อมั่นสูง

ข้อมูลที่ Google Safe Browsing API รวบรวม

SafetyNet Safe Browsing API จะรวบรวมข้อมูลต่อไปนี้โดยอัตโนมัติเมื่อสื่อสารกับบริการ Google Safe Browsing บน Android

ข้อมูล คำอธิบาย
กิจกรรมบนแอป รวบรวมคำนำหน้าแฮชของ URL หลังจากที่คำนำหน้าแฮชตรงกันในเครื่องเพื่อ ตรวจหา URL ที่เป็นอันตราย

SafetyNet Google Safe Browsing API จะรวบรวมคำนำหน้าแฮชของ URL เพื่อตรวจหา URL ที่เป็นอันตราย เวอร์ชัน 5 ใช้ Oblivious HTTP เพื่อปกป้องข้อมูลผู้ใช้เพิ่มเติมระหว่างการค้นหาเหล่านี้

แม้ว่าเราจะมุ่งมั่นที่จะสร้างความโปร่งใสมากที่สุดเท่าที่จะทำได้ แต่คุณมีหน้าที่รับผิดชอบแต่เพียงผู้เดียวในการตัดสินใจว่าจะตอบกลับแบบฟอร์มส่วนความปลอดภัยของข้อมูล Google Playที่เกี่ยวกับการเก็บรวบรวมข้อมูล การแชร์ และแนวทางปฏิบัติด้านการรักษาความปลอดภัยข้อมูลผู้ใช้ในแอปอย่างไร