Cách phát hiện gian lận quảng cáo và chặn click injection trên thiết bị Android

opoinstall
2026-09-08
5 min read

Làm thế nào để phát hiện click injection trong marketing hiệu suất? Việc phát hiện click injection đòi hỏi phải phân tích dấu thời gian (timestamp) cài đặt Android thông qua Google Play Install Referrer API, xác định các trường hợp mà dấu thời gian nhấp quảng cáo được ghi lại xảy ra sau khi quá trình cài đặt gói bắt đầu trên Google Play, hoặc trong một khoảng thời gian ngắn bất thường so với dữ liệu cơ sở của ứng dụng và kênh phân phối.

Click injection là một dạng gian lận quảng cáo di động tinh vi đặc thù trên các thiết bị Android, trong đó các ứng dụng độc hại theo dõi sự kiện cài đặt của hệ điều hành để kích hoạt các lượt nhấp quảng cáo giả mạo trong khi ứng dụng mục tiêu đang được tải xuống. Bằng cách khai thác độ trễ giữa thời điểm bắt đầu tải xuống và lần khởi chạy ứng dụng đầu tiên, click injection chiếm đoạt quyền ghi nhận đóng góp (attribution) từ các kênh tiếp thị hợp pháp hoặc khám phá tự nhiên.

Thuật ngữ Định nghĩa Thực thể liên quan Vai trò mục đích tìm kiếm
Gian lận quảng cáo (Ad Fraud) Việc tạo ra các lượt nhấp không hợp lệ hoặc chuyển đổi giả mạo nhằm rút cạn ngân sách tiếp thị. Theo dõi ghi nhận (Attribution Tracking) Thông tin / Thương mại
Click Injection Vectơ gian lận đặc thù trên Android, kích hoạt các lượt nhấp giả mạo trong quá trình cài đặt gói. Google Play Install Referrer Kỹ thuật / Thông tin
Google Play Install Referrer Một API nền tảng cung cấp siêu dữ liệu giới thiệu và dấu thời gian bắt đầu cài đặt/nhấp từ Google Play; các hợp đồng AIDL cấp thấp hơn định nghĩa thêm các trường thời gian từ phía máy chủ. Marketing hiệu suất Thông tin

Tại sao Click Injection khó phát hiện trong ghi nhận Android?

Sự đánh cắp ghi nhận âm thầm: Tại sao dữ liệu đo lường chuyển đổi trong ứng dụng trông vẫn bình thường

Trong tiếp thị hiệu suất kỹ thuật số, lưu lượng truy cập gian lận thường bộc lộ qua các chỉ số tương tác sau cài đặt suy giảm. Các vectơ tạo chuyển đổi giả mạo—như trang trại thiết bị, trình giả lập hoặc giả mạo SDK—thường tạo ra hành vi hạ nguồn không nhất quán hoặc giả tạo trừ khi hoạt động sau cài đặt cũng bị làm giả. Trong các môi trường không được kiểm soát, người dùng giả tạo không tạo ra lượt hiển thị quảng cáo nào, không hoàn thành các cột mốc giới thiệu và không bao giờ chuyển đổi thành khách hàng trả phí.

Click injection hoạt động theo cách cơ bản khác biệt. Trong kịch bản click injection, người dùng thực tế đang tải xuống ứng dụng là một con người thật, có ý định cao. Người dùng đã chủ động tìm thấy ứng dụng, bắt đầu tải xuống từ Google Play Store và hoàn thành các quy trình giới thiệu tiêu chuẩn. Vì người dùng là xác thực, dữ liệu đo lường hạ nguồn có thể trông hoàn toàn bình thường, hiển thị tỷ lệ giữ chân từ ngày 1 đến ngày 30, tần suất phiên và mô hình mua hàng trong ứng dụng tiêu chuẩn.

Điều này làm cho click injection trở thành một vectơ tấn công âm thầm. Gian lận không làm hỏng trải nghiệm người dùng hoặc phá vỡ phân tích sản phẩm; thay vào đó, nó chỉ làm sai lệch quyền ghi nhận đóng góp. Các nhà quảng cáo tiếp tục trả phí theo lượt cài đặt (CPI) hoặc hành động (CPA) cho các mạng quảng cáo gian lận, tin rằng các nhà xuất bản đó đã mang lại những nhóm người dùng chất lượng cao.

Tác động kinh tế: Làm cạn kiệt ngân sách marketing trên các lượt cài đặt tự nhiên

Mục tiêu giá trị cao của click injection là lưu lượng truy cập tự nhiên. Khi một người dùng tự nhiên tìm kiếm ứng dụng trên Google Play Store và nhấn "Cài đặt", người dùng đó đã được thu hút mà không cần chi tiêu quảng cáo trực tiếp. Bằng cách kích hoạt lượt nhấp quảng cáo giả mạo trong khi gói ứng dụng đang tải xuống, các mạng gian lận chiếm đoạt quyền ghi nhận đóng góp cho lượt cài đặt tự nhiên đó.

Hậu quả tài chính tăng lên trên hai mặt trận:

  • Phân bổ vốn sai lệch trực tiếp: Ngân sách tiếp thị bị rút cạn để trả phí hoa hồng cho các lượt cài đặt tự nhiên vốn không đòi hỏi chi phí quảng bá.
  • Chỉ số tự nhiên bị suy giảm nhân tạo: Do các chuyển đổi tự nhiên bị phân loại lại thành lượt cài đặt từ đối tác trả phí, các đội ngũ tiếp thị đánh giá thấp tốc độ tăng trưởng cơ sở thực sự của khám phá tự nhiên và giá trị thương hiệu.

Theo thời gian, sự đánh cắp quyền ghi nhận này làm biến dạng việc đánh giá kênh tiếp thị, khiến các đội ngũ tăng trưởng tăng chi tiêu quảng cáo cho các ID nhà xuất bản gian lận trong khi giảm đầu tư vào tiếp thị thương hiệu chân chính.

Tại sao theo dõi postback tiêu chuẩn thất bại trong việc phát hiện Click Injection

Các quy trình postback máy chủ-với-máy chủ (S2S) tiêu chuẩn hoạt động theo khung ghi nhận điểm chạm cuối cùng (last-touch). Khi một ứng dụng mới cài đặt khởi chạy lần đầu tiên, công cụ đo lường di động sẽ kiểm tra cơ sở dữ liệu của nó để tìm lượt nhấp gần nhất liên quan đến định danh quảng cáo hoặc mã thông báo ghi nhận của người dùng trong khung thời gian xem xét được định cấu hình.

Nếu một mạng quảng cáo kích hoạt lượt nhấp giả mạo vài giây trước khi ứng dụng được mở, lượt nhấp đó sẽ chiếm vị trí tạm thời cuối cùng trong nhật ký ghi nhận. Logic postback chỉ dựa vào dấu thời gian nhấp cuối cùng không thể xác định độc lập liệu lượt nhấp đó xảy ra trước khi người dùng điều hướng đến cửa hàng hay trong khi gói ứng dụng đã được tải xuống bộ nhớ thiết bị.

Việc ngăn chặn click injection đòi hỏi phải thâm nhập vào điểm mù tải xuống này bằng cách thu thập dấu thời gian ở cấp hệ điều hành trực tiếp từ cơ sở hạ tầng Google Play Store.

Các nhà phát triển tìm kiếm dữ liệu đo lường khách hàng nhẹ và các SDK ghi nhận có thể khám phá các gói thông qua gói SDK phân tích di động.

Click Injection khai thác các sự kiện gói Android để chiếm đoạt chuyển đổi như thế nào

Giải phẫu một cuộc tấn công tiêm nhiễm: Ứng dụng tiện ích độc hại và người quan sát nền

Click injection dựa vào các ứng dụng độc hại đang chạy trên thiết bị Android của người dùng. Các ứng dụng gian lận này thường được ngụy trang dưới dạng công cụ tiện ích—như đèn pin, máy quét mã QR, trình làm sạch hệ thống hoặc trò chơi thông thường—được phân phối qua các chợ ứng dụng bên thứ ba hoặc các danh sách cửa hàng bị xâm nhập.

Sau khi cài đặt, tiện ích độc hại yêu cầu khả năng thực thi nền. Trong lịch sử, các ứng dụng gian lận trên Android lạm dụng việc quan sát gói và trạng thái cài đặt để phát hiện khi nào quá trình tải xuống mục tiêu bắt đầu. Mặc dù các bản phát hành Android hiện đại ngày càng hạn chế việc thực thi nền và thực thi các khai báo về khả năng hiển thị gói, các ứng dụng gian lận vẫn tiếp tục tìm kiếm các vectơ quan sát nền tảng có sẵn để xác định khi nào các gói mới đang được cài đặt.

[Ứng dụng tiện ích độc hại ở chế độ nền]
           │
           ├─► Bước 1: Quan sát tín hiệu trạng thái cài đặt có sẵn
           ├─► Bước 2: Xác định tên gói mục tiêu (ví dụ: com.example.app)
           ├─► Bước 3: Truy vấn phần phụ trợ mạng quảng cáo gian lận để lấy liên kết theo dõi
           └─► Bước 4: Kích hoạt lượt nhấp quảng cáo giả mạo theo lập trình thông qua yêu cầu không đầu (headless)

Khai thác cửa sổ trung gian: Độ trễ vật lý giữa bắt đầu tải xuống và mở gói

Giữa khoảnh khắc người dùng nhấn "Cài đặt" trên Google Play Store và khoảnh khắc họ nhấn "Mở", một độ trễ vật lý không thể tránh khỏi xảy ra. Cửa sổ trung gian này bao gồm ba giai đoạn vận hành tuần tự:

  1. Truyền gói: Các tệp APK cụ thể của ứng dụng được tải xuống qua Wi-Fi hoặc mạng di động, với thời gian được xác định bởi kích thước tệp, băng thông mạng và độ trễ máy chủ.
  2. Xác minh và cài đặt gói: Hệ điều hành Android quét gói, xác minh chữ ký số và giải nén tệp vào bộ nhớ cục bộ, được điều khiển bởi hiệu suất phần cứng thiết bị.
  3. Độ trễ khởi chạy: Người dùng xem quá trình cài đặt hoàn tất trên màn hình chính hoặc giao diện cửa hàng và nhấn vào biểu tượng ứng dụng để khởi chạy lần đầu tiên, có thể kéo dài từ vài giây đến nhiều giờ.

Cửa sổ trung gian này cung cấp một hành lang tạm thời dễ bị tấn công. Khi ứng dụng độc hại phát hiện rằng quá trình tải xuống mục tiêu đã bắt đầu, nó có đủ thời gian để truy vấn máy chủ quảng cáo của mình, nhận URL theo dõi và kích hoạt lượt nhấp giả mạo trước khi ứng dụng mục tiêu thực thi mã ban đầu của nó.

Cách những kẻ gian lận chơi đùa với các quy tắc ghi nhận điểm chạm cuối cùng

Các mô hình ghi nhận điểm chạm cuối cùng trao 100% tín dụng chuyển đổi cho lượt nhấp cuối cùng được ghi lại trước khi cài đặt. Những kẻ gian lận sử dụng click injection để đảm bảo dấu thời gian nhấp của chúng được định vị theo trình tự thời gian sau tất cả các điểm chạm hợp pháp.

Nếu một nhà xuất bản hợp pháp đã mang lại lượt hiển thị và nhấp chuột xác thực vài ngày trước (tlegitimatet_{\text{legitimate}}), và ứng dụng độc hại kích hoạt lượt nhấp được tiêm nhiễm vài giây trước khi ứng dụng được mở (tinjectedt_{\text{injected}}), dòng thời gian ghi nhận ghi lại:

tlegitimate<tdownload_start<tinjected<tapp_launcht_{\text{legitimate}} < t_{\text{download\_start}} < t_{\text{injected}} < t_{\text{app\_launch}}

Theo logic điểm chạm cuối cùng tiêu chuẩn, công cụ ghi nhận trao chuyển đổi cho lượt nhấp bị tiêm nhiễm, hoàn toàn loại bỏ đóng góp của nhà xuất bản hợp pháp.

Tấn công click injection trên Android trong quá trình cài đặt ứng dụng thực tế

Toán học của các Deltas thời gian Install Referrer và Đảo ngược nhấp chuột

Định nghĩa các trường thời gian nền tảng: Dấu thời gian nhấp so với Dấu thời gian bắt đầu cài đặt

Việc đánh bại click injection đòi hỏi phải đánh giá trình tự cài đặt so với các trường thời gian do nền tảng cung cấp thay vì các đồng hồ treo tường phía máy khách chưa được xác minh.

Thư viện ứng dụng Google Play Install Referrer hiển thị hai trường thời gian cấp máy khách chính:

  • Dấu thời gian nhấp giới thiệu (treferrer_clickt_{\text{referrer\_click}}): Dấu thời gian máy khách được ghi lại bởi Google Play khi liên kết giới thiệu được nhấp (referrerClickTimestampSeconds).
  • Dấu thời gian bắt đầu cài đặt (tinstall_begint_{\text{install\_begin}}): Dấu thời gian máy khách được ghi lại khi quá trình cài đặt gói bắt đầu trên Google Play (installBeginTimestampSeconds).

Trong hợp đồng dịch vụ Play Install Referrer AIDL cấp thấp hơn, Google cũng định nghĩa các đối tác thời gian phía máy chủ (referrer_click_timestamp_server_secondsinstall_begin_timestamp_server_seconds). Trong khi các giá trị của Thư viện ứng dụng cung cấp các tín hiệu thời gian cục bộ có giá trị, các kiến trúc phụ trợ đối chiếu chúng với các bản ghi nhấp chuột của mạng quảng cáo ngược dòng để thiết lập một dòng thời gian đa nguồn.

Xây dựng thời gian từ nhấp đến bắt đầu cài đặt

Sử dụng các dấu thời gian nền tảng này, các công cụ ghi nhận tính toán Thời gian từ Nhấp đến Bắt đầu Cài đặt (CTITinstall_begin\text{CTIT}_{\text{install\_begin}}):

CTITinstall_begin=tinstall_begintreferrer_click\text{CTIT}_{\text{install\_begin}} = t_{\text{install\_begin}} - t_{\text{referrer\_click}}

Trong các hành trình người dùng hợp pháp nơi quảng cáo thúc đẩy cài đặt một cách nguyên nhân, trình tự thời gian mong đợi yêu cầu lượt nhấp phải xảy ra trước khi bắt đầu cài đặt:

Expected Temporal Ordering:treferrer_clicktinstall_begin    CTITinstall_begin0\text{Expected Temporal Ordering}: \quad t_{\text{referrer\_click}} \le t_{\text{install\_begin}} \implies \text{CTIT}_{\text{install\_begin}} \ge 0

Trong các tương tác do con người thúc đẩy xác thực, CTITinstall_begin\text{CTIT}_{\text{install\_begin}} trải dài trên một phân phối biến đổi được định hình bởi thời gian duyệt cửa hàng, tốc độ kết nối và các quyết định cài đặt tức thì hoặc trì hoãn.

Phát hiện đảo ngược nhấp chuột: Xác định các trình tự thời gian không nhất quán

Click injection tạo ra một sự đảo ngược thời gian trong đó lượt nhấp quảng cáo được tuyên bố xảy ra sau khi quá trình cài đặt gói ứng dụng đã bắt đầu:

Inversion Condition (Candidate Injection):CTITinstall_begin<0\text{Inversion Condition (Candidate Injection)}: \quad \text{CTIT}_{\text{install\_begin}} < 0
Equivalent Statement:treferrer_click>tinstall_begin\text{Equivalent Statement}: \quad t_{\text{referrer\_click}} > t_{\text{install\_begin}}
Dòng thời gian (t) ──►
[Người dùng nhấn "Cài đặt" trong Play Store] ───► [Google Play Bắt đầu cài đặt] ──► [Ứng dụng khởi chạy lần đầu]
                   │                               │                               │
                   ▼                               ▼                               ▼
        t_download_click (Thực tế)             t_install_begin                 t_app_first_launch
                                                   ▲                               ▲
                                                   │  [LƯỢT NHẤP TIÊM NHIỄM ĐỘC HẠI]   │
                                                   └─── t_referrer_click ──────────┘
                                                   (CTIT_install_begin < 0: PHÁT HIỆN ĐẢO NGƯỢC)

Đảo ngược thời gian CTIT âm để phát hiện click injection trên Android

Delta từ Nhấp đến Bắt đầu Cài đặt âm là một bất thường về thời gian mạnh mẽ không nhất quán với việc lượt nhấp được tuyên bố là nguyên nhân xảy ra trước khi cài đặt. Ý nghĩa gian lận của nó nên được đánh giá cùng với bằng chứng ghi nhận phía máy chủ độc lập trong một chính sách đánh giá gian lận đa tín hiệu.

Cách triển khai dữ liệu đo lường Google Play Install Referrer trong SDK Android

Thêm phần phụ thuộc Google Play Install Referrer trong build.gradle

Để thu thập dấu thời gian cửa hàng trên Android, ứng dụng phải bao gồm thư viện ứng dụng chính thức Google Play Install Referrer.

Thêm phần phụ thuộc vào tệp build.gradle ở cấp ứng dụng:

dependencies {
    implementation("com.android.installreferrer:installreferrer:2.2")
}

Liên kết tới InstallReferrerClient và xử lý trạng thái kết nối bất đồng bộ

InstallReferrerClient giao tiếp với ứng dụng Google Play Store thông qua kết nối Dịch vụ Android IPC. Vì dữ liệu install referrer vẫn khả dụng trong ít nhất 90 ngày và không thay đổi giữa các phiên trừ khi cài đặt lại, các ứng dụng khách hàng nên tìm nạp dữ liệu này một lần khi khởi chạy ban đầu và lưu kết quả cục bộ.

Cách triển khai Kotlin dưới đây minh họa cách liên kết tới InstallReferrerClient, xử lý trạng thái kết nối bất đồng bộ, trích xuất dấu thời gian máy khách (referrerClickTimestampSecondsinstallBeginTimestampSeconds), tính toán delta thời gian và quản lý tính bền vững cục bộ để lỗi tải lên mạng không gây ra mất dữ liệu đo lường:


```kotlin
// [CODE_BLOCK_01] Triển khai Android Kotlin
package com.example.analytics.antifraud

import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.os.RemoteException
import android.util.Log
import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener
import com.android.installreferrer.api.ReferrerDetails

class PlayInstallReferrerManager(private val context: Context) {

    private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    private lateinit var referrerClient: InstallReferrerClient

    fun retrieveInstallReferrerTelemetry(onTelemetryReady: (ReferrerTelemetryPayload) -> Unit) {
        // Thực thi tính đẳng cấu: Dữ liệu giới thiệu Google Play tồn tại trong 90 ngày và chỉ nên được truy vấn một lần
        if (prefs.getBoolean(KEY_REFERRER_UPLOADED, false)) {
            Log.d(TAG, "Dữ liệu đo lường Install Referrer đã được gửi. Bỏ qua truy vấn trùng lặp.")
            return
        }

        // Kiểm tra xem đã được lưu cục bộ để tránh liên kết lại với Google Play nếu tải lên trước đó thất bại
        if (prefs.getBoolean(KEY_REFERRER_CACHED, false)) {
            val cachedPayload = getCachedPayload()
            if (cachedPayload != null) {
                Log.d(TAG, "Đang phân phối dữ liệu Install Referrer đã lưu cục bộ để thử lại tải lên.")
                onTelemetryReady(cachedPayload)
                return
            }
        }

        referrerClient = InstallReferrerClient.newBuilder(context).build()
        
        referrerClient.startConnection(object : InstallReferrerStateListener {
            override fun onInstallReferrerSetupFinished(responseCode: Int) {
                when (responseCode) {
                    InstallReferrerClient.InstallReferrerResponse.OK -> {
                        try {
                            val response: ReferrerDetails = referrerClient.installReferrer
                            
                            // Trích xuất dấu thời gian thư viện ứng dụng chính thức (giây kể từ epoch)
                            val clickTimestampSeconds = response.referrerClickTimestampSeconds
                            val installBeginTimestampSeconds = response.installBeginTimestampSeconds
                            val rawReferrerUrl = response.installReferrer
                            val isInstantApp = response.googlePlayInstantParam

                            // Tính toán delta từ Nhấp đến Bắt đầu Cài đặt
                            val ctitDeltaSeconds = installBeginTimestampSeconds - clickTimestampSeconds
                            
                            // Đánh dấu đảo ngược thời gian: lượt nhấp được ghi lại sau khi bắt đầu cài đặt
                            val isClickInversionDetected = ctitDeltaSeconds < 0

                            val sanitizedReferrer = validateAndSanitizeReferrer(rawReferrerUrl)

                            val payload = ReferrerTelemetryPayload(
                                referrerString = sanitizedReferrer,
                                clickTimestampSeconds = clickTimestampSeconds,
                                installBeginTimestampSeconds = installBeginTimestampSeconds,
                                ctitDeltaSeconds = ctitDeltaSeconds,
                                isClickInversionDetected = isClickInversionDetected,
                                isInstantApp = isInstantApp
                            )

                            // Lưu bền vững payload cục bộ trước khi thử tải lên cổng (gateway)
                            cachePayloadLocally(payload)

                            Log.i(TAG, "Install Referrer đã bắt: CTIT Delta=${ctitDeltaSeconds}s, Đảo ngược=$isClickInversionDetected")
                            onTelemetryReady(payload)
                            
                        } catch (e: RemoteException) {
                            Log.e(TAG, "Lỗi giao tiếp từ xa IPC với Google Play Store: ${e.message}")
                        } catch (e: SecurityException) {
                            Log.e(TAG, "Lỗi bảo mật khi liên kết với dịch vụ Play Store: ${e.message}")
                        } catch (e: Exception) {
                            Log.e(TAG, "Không thể đọc chi tiết Install Referrer: ${e.message}")
                        } finally {
                            endConnectionSafely()
                        }
                    }
                    InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED -> {
                        Log.w(TAG, "API Install Referrer không được hỗ trợ trên thiết bị hoặc ứng dụng cửa hàng này.")
                        endConnectionSafely()
                    }
                    InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE -> {
                        Log.w(TAG, "Dịch vụ Google Play Store không khả dụng trong quá trình liên kết.")
                        endConnectionSafely()
                    }
                    InstallReferrerClient.InstallReferrerResponse.DEVELOPER_ERROR -> {
                        Log.e(TAG, "Lỗi cấu hình nhà phát triển Install Referrer.")
                        endConnectionSafely()
                    }
                }
            }

            override fun onInstallReferrerServiceDisconnected() {
                Log.d(TAG, "Dịch vụ Install Referrer đã ngắt kết nối.")
            }
        })
    }

    fun markTelemetryDelivered() {
        // Được gọi chỉ sau khi cổng phụ trợ xác nhận việc nhận dữ liệu một cách bền vững
        prefs.edit()
            .putBoolean(KEY_REFERRER_UPLOADED, true)
            // Dọn dẹp dữ liệu payload đã lưu sau khi nhận để tối thiểu hóa dữ liệu
            .remove(KEY_CACHED_REFERRER)
            .remove(KEY_CACHED_CLICK_SEC)
            .remove(KEY_CACHED_INSTALL_SEC)
            .remove(KEY_CACHED_DELTA_SEC)
            .remove(KEY_CACHED_INVERSION)
            .remove(KEY_CACHED_INSTANT)
            .apply()
        Log.d(TAG, "Dữ liệu Install Referrer đã được xác nhận và payload đã lưu đã bị xóa.")
    }

    private fun endConnectionSafely() {
        try {
            if (::referrerClient.isInitialized && referrerClient.isReady) {
                referrerClient.endConnection()
            }
        } catch (e: Exception) {
            Log.w(TAG, "Lỗi đóng ứng dụng giới thiệu: ${e.message}")
        }
    }

    private fun validateAndSanitizeReferrer(rawUrl: String?): String? {
        if (rawUrl.isNullOrBlank() || rawUrl.length > 2048) return null
        return try {
            val uri = Uri.parse("https://dummy.local/?$rawUrl")
            val allowedKeys = setOf("utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "channelCode")
            val sanitizedParams = uri.queryParameterNames
                .filter { it in allowedKeys }
                .joinToString("&") { key -> "$key=${Uri.encode(uri.getQueryParameter(key))}" }
            sanitizedParams.ifBlank { null }
        } catch (e: Exception) {
            null
        }
    }

    private fun cachePayloadLocally(payload: ReferrerTelemetryPayload) {
        prefs.edit()
            .putBoolean(KEY_REFERRER_CACHED, true)
            .putString(KEY_CACHED_REFERRER, payload.referrerString)
            .putLong(KEY_CACHED_CLICK_SEC, payload.clickTimestampSeconds)
            .putLong(KEY_CACHED_INSTALL_SEC, payload.installBeginTimestampSeconds)
            .putLong(KEY_CACHED_DELTA_SEC, payload.ctitDeltaSeconds)
            .putBoolean(KEY_CACHED_INVERSION, payload.isClickInversionDetected)
            .putBoolean(KEY_CACHED_INSTANT, payload.isInstantApp)
            .apply()
    }

    private fun getCachedPayload(): ReferrerTelemetryPayload? {
        if (!prefs.getBoolean(KEY_REFERRER_CACHED, false)) return null
        return ReferrerTelemetryPayload(
            referrerString = prefs.getString(KEY_CACHED_REFERRER, null),
            clickTimestampSeconds = prefs.getLong(KEY_CACHED_CLICK_SEC, 0L),
            installBeginTimestampSeconds = prefs.getLong(KEY_CACHED_INSTALL_SEC, 0L),
            ctitDeltaSeconds = prefs.getLong(KEY_CACHED_DELTA_SEC, 0L),
            isClickInversionDetected = prefs.getBoolean(KEY_CACHED_INVERSION, false),
            isInstantApp = prefs.getBoolean(KEY_CACHED_INSTANT, false)
        )
    }

    companion object {
        private const val TAG = "PlayReferrerManager"
        private const val PREFS_NAME = "antifraud_referrer_prefs"
        private const val KEY_REFERRER_CACHED = "key_play_referrer_cached"
        private const val KEY_REFERRER_UPLOADED = "key_play_referrer_uploaded"
        private const val KEY_CACHED_REFERRER = "key_cached_referrer_str"
        private const val KEY_CACHED_CLICK_SEC = "key_cached_click_sec"
        private const val KEY_CACHED_INSTALL_SEC = "key_cached_install_sec"
        private const val KEY_CACHED_DELTA_SEC = "key_cached_delta_sec"
        private const val KEY_CACHED_INVERSION = "key_cached_inversion"
        private const val KEY_CACHED_INSTANT = "key_cached_instant"
    }
}

data class ReferrerTelemetryPayload(
    val referrerString: String?,
    val clickTimestampSeconds: Long,
    val installBeginTimestampSeconds: Long,
    val ctitDeltaSeconds: Long,
    val isClickInversionDetected: Boolean,
    val isInstantApp: Boolean
)
Dữ liệu đo lường Android Install Referrer và xác thực gian lận phía máy chủ

Truyền dữ liệu đo lường giới thiệu đã được lọc sạch đến các cổng tiếp nhận máy chủ

Đánh giá phía máy khách cung cấp dữ liệu đo lường cục bộ, nhưng việc xử lý ghi nhận cuối cùng phải được thực hiện trên phần phụ trợ ghi nhận. Các thiết bị máy khách có thể bị giả mạo cục bộ, móc nối khung (framework hooking) hoặc chặn proxy.

Việc triển khai thực hiện lọc danh sách cho phép mang tính minh họa trước khi truyền đến máy chủ; các triển khai sản xuất nên thực thi thêm giới hạn độ dài cấp trường, xác thực mã hóa ký tự và các quy tắc phân loại dữ liệu.

Sau khi trích xuất ReferrerDetails, SDK bản địa xác thực các tham số đến:

  • referrer_url: Được phân tích cú pháp và lọc dựa trên danh sách cho phép các khóa chiến dịch mong đợi (utm_source, utm_campaign, channelCode), loại bỏ các tham số truy vấn không chuẩn.
  • referrer_click_timestamp_seconds: Dấu thời gian epoch nhấp chuột cấp máy khách.
  • install_begin_timestamp_seconds: Dấu thời gian epoch bắt đầu tải xuống cấp máy khách.
  • google_play_instant: Cờ boolean cho biết ứng dụng có được khởi chạy qua Google Play Instant hay không.

Dữ liệu này được truyền qua kết nối được mã hóa TLS đến cổng tiếp nhận ghi nhận. Công cụ phụ trợ đối chiếu các trường thời gian Thư viện ứng dụng với các bản ghi nhấp chuột của mạng quảng cáo/máy chủ độc lập và, ở những nơi việc triển khai hiển thị bằng chứng thời gian Play phía máy chủ được hỗ trợ, kết hợp các bản ghi đó một cách riêng biệt.

Đánh giá so sánh các chữ ký thời gian của Click Injection và Click Spamming

Đối chiếu các vectơ chiếm đoạt ghi nhận trên các cấu hình độ trễ, khối lượng và CVR

Mặc dù click injection và click spamming đều được phân loại là chiếm đoạt ghi nhận, chúng thể hiện các chữ ký dữ liệu đo lường tương phản trên các cơ chế phân phối, delta thời gian và tỷ lệ chuyển đổi.

Ma trận dưới đây đối chiếu các vectơ chiếm đoạt ghi nhận chính với lưu lượng truy cập con người hợp pháp:

Chiều đánh giá Click Injection (Chiếm đoạt cài đặt) Click Spamming (Click Flooding) Ghi nhận con người hợp pháp
Liên kết nền tảng chính Liên quan lịch sử với Android Đa nền tảng (iOS, Android, Mobile Web) Đa nền tảng
Delta từ Nhấp đến Bắt đầu Cài đặt Delta thời gian đảo ngược (CTIT<0\text{CTIT} < 0) Delta không đảo ngược Không âm (Phụ thuộc vào cơ sở)
Thời gian trung bình để cài đặt (MTTI) Bất thường tập trung ở đuôi trái Đuôi cửa sổ muộn mở rộng bất thường Phân phối cơ sở thực nghiệm
Tỷ lệ chuyển đổi chiến dịch Bình thường đến cao (Nhắm mục tiêu người tải xuống hoạt động) Suy giảm so với cơ sở kênh Cơ sở kênh tiêu chuẩn
Bằng chứng phát hiện chính So sánh thời gian Install Referrer Mô hình hóa phân phối MTTI & Giới hạn tốc độ IP Xác minh ghi nhận đa yếu tố

So sánh thời gian của click injection flooding và lưu lượng hợp pháp

Phân biệt các đợt tăng vọt injection với lượt tải xuống nhanh của con người

Trên các kết nối cáp quang hoặc 5G tốc độ cao, một ứng dụng nhẹ có thể tải xuống và cài đặt nhanh chóng. Nếu một công cụ ghi nhận chỉ dựa vào MTTI đầu-cuối (TimestamplaunchTimestampclick\text{Timestamp}_{\text{launch}} - \text{Timestamp}_{\text{click}}), các lượt tải xuống hợp pháp tốc độ cao có thể bị gắn cờ sai là click injection.

Google Play Install Referrer API cung cấp sự phân biệt quan trọng. Ngay cả khi người dùng tải xuống ứng dụng nhanh chóng trên kết nối tốc độ cao, lượt nhấp xác thực của họ đã xảy ra trước khi bắt đầu cài đặt (CTITinstall_begin0\text{CTIT}_{\text{install\_begin}} \ge 0). Ngược lại, click injection ghi lại lượt nhấp sau khi quá trình cài đặt bắt đầu (CTITinstall_begin<0\text{CTIT}_{\text{install\_begin}} < 0), cung cấp sự phân tách đáng tin cậy bất kể tốc độ kết nối hoặc kích thước gói.

Khi nào cần các cửa sổ chiếm đoạt nhấp chuột thời gian thực cho các nhà tiếp thị hiệu suất

Cấu hình các quy tắc giám sát gian lận OpoInstall cho ghi nhận Android

OpoInstall cung cấp một công cụ Giám sát Gian lận được thiết kế để xác định sự chiếm đoạt ghi nhận trên các chiến dịch thu hút người dùng di động.

Các kỹ sư có thể tham khảo tài liệu giám sát gian lận để biết các thông số kỹ thuật về việc thiết lập các quy tắc bất thường và xem xét các báo cáo ngoại lệ.

Các quy tắc cấu hình chính bao gồm:

  • Khoảng thời gian chiếm đoạt nhấp chuột: Xác định ngưỡng MTTI tối thiểu do khách hàng định cấu hình được hiệu chỉnh dựa trên kích thước gói ứng dụng và môi trường mạng cơ sở. Các lượt cài đặt hoàn tất trong khoảng thời gian ngắn bất thường mà dấu thời gian nhấp xung đột với thực tế tải xuống sẽ được gắn cờ là các nỗ lực chiếm đoạt nhấp chuột ứng viên.
  • Phân bổ ghi nhận thời gian thực: Công cụ quy tắc đánh giá các lượt nhấp ứng viên dựa trên các chính sách được định cấu hình trước khi kích hoạt postback mạng. Nếu một lượt cài đặt được gắn cờ là một chuyển đổi chiếm đoạt ứng viên, công cụ ghi nhận có thể từ chối yêu cầu của đối tác hoặc định tuyến sự kiện vào một đường dẫn hòa giải tự nhiên hoặc không được ghi nhận theo chính sách ghi nhận được định cấu hình.
  • Ngưỡng bất thường thiết bị cài đặt và IP: Giới hạn các yêu cầu cài đặt cho phép bắt nguồn từ các mạng con IP đơn lẻ hoặc các định danh bất thường thiết bị nội bộ trong khoảng thời gian 24 giờ, xác định hoạt động trang trại phối hợp.

Kiểm toán thống kê ngoại lệ: Đi sâu vào các kênh bất thường và mạng con tiêm nhiễm

Khi các quy tắc chống gian lận chặn hoạt động đáng ngờ, bảng điều khiển giám sát ghi nhật ký dữ liệu đo lường trong các báo cáo ngoại lệ chuyên dụng:

  • Báo cáo thiết bị và IP ngoại lệ: Theo dõi các mạng con cụ thể và định danh bất thường thiết bị nội bộ liên quan đến việc lặp đi lặp lại click injection hoặc các yêu cầu cài đặt mật độ cao.
  • Báo cáo phân phối MTTI: Trực quan hóa độ trễ từ nhấp đến cài đặt trên một mô hình khoảng phân tích do sản phẩm định nghĩa, cho phép các đội ngũ tăng trưởng so sánh các kênh ứng viên với các cơ sở tổng hợp. Các kênh hiển thị các đỉnh đuôi trái bất thường được cô lập để hòa giải đối tác.

Các điều kiện phù hợp so với không phù hợp cho bảo vệ Click Injection chuyên dụng

Việc triển khai cơ sở hạ tầng bảo vệ click injection chuyên dụng mang lại lợi nhuận hoạt động cao trong các điều kiện chiến dịch cụ thể:

  • Các điều kiện phù hợp:
    • Các chiến dịch Android quy mô cao được phân phối trên các DSP chương trình, mạng quảng cáo và môi giới liên kết đa tầng.
    • Các ứng dụng có khối lượng cài đặt tự nhiên cao nghi ngờ bị chiếm đoạt ghi nhận bởi các mạng quảng cáo gian lận.
    • Các chiến dịch sử dụng các kênh quảng cáo không phải SAN nơi dấu thời gian nhấp thô được gửi bởi các nhà xuất bản bên thứ ba.
  • Các điều kiện không phù hợp:
    • Các chiến dịch tiếp thị iOS thuần túy: iOS không hiển thị khả năng quan sát cài đặt gói chéo ứng dụng đa năng tương đương cho các ứng dụng bên thứ ba thông thường, khiến click injection cổ điển không khả thi trên các thiết bị iOS không bẻ khóa.
    • Các bề mặt thu hút do nền tảng quản lý: Các bề mặt quảng cáo đóng xử lý ghi nhận trong cơ sở hạ tầng nền tảng, nơi sự tiếp xúc với việc chiếm đoạt ghi nhận nền bên thứ ba thấp hơn đáng kể.

Các quan niệm sai lầm phổ biến trong phòng chống Click Injection

  • Quan niệm sai lầm 1: Các chỉ số giữ chân sau cài đặt sẽ bộc lộ Click Injection: Vì click injection chiếm đoạt những người dùng con người thực sự, những người tự nhiên dự định sử dụng ứng dụng, các chỉ số giữ chân từ ngày 1 đến ngày 30 và mua hàng trong ứng dụng có thể trông bình thường. Việc dựa vào phân tích sản phẩm để phát hiện click injection là không hiệu quả.
  • Quan niệm sai lầm 2: URL chuyển hướng web có thể chặn lượt nhấp bị tiêm nhiễm: URL theo dõi quản lý quá trình chuyển đổi từ web sang cửa hàng ứng dụng. Chúng không có khả năng hiển thị các sự kiện hệ điều hành Android phía máy khách xảy ra vài phút sau đó trong khi APK đang tải xuống. Bảo vệ đòi hỏi tích hợp Google Play Install Referrer bản địa.

Các câu hỏi thường gặp (FAQ)

Điều gì làm cho click injection trở nên đặc thù đối với các thiết bị Android?
Click injection gắn liền với lịch sử Android vì các kiến trúc hệ điều hành cũ cho phép các ứng dụng nền theo dõi các thay đổi về trạng thái cài đặt gói. Các ứng dụng tiện ích độc hại tận dụng các tín hiệu quan sát này để kích hoạt các lượt nhấp quảng cáo giả mạo trong khi một ứng dụng mục tiêu đang tải xuống từ Google Play Store. Trên iOS, sự cô lập sandbox nghiêm ngặt ngăn các ứng dụng phát hiện các cài đặt ứng dụng khác.
Google Play Install Referrer API giúp phát hiện click injection như thế nào?
Google Play Install Referrer API cung cấp các trường thời gian giới thiệu Google Play ghi lại thời điểm liên kết giới thiệu quảng cáo được nhấp và khi quá trình cài đặt gói ứng dụng bắt đầu. Nếu lượt nhấp được ghi lại xảy ra sau khi cài đặt bắt đầu, phần phụ trợ ghi nhận có thể coi sự đảo ngược thời gian đó là một bất thường có mức độ nghiêm trọng cao và áp dụng các chính sách từ chối được định cấu hình.
Click injection có thể xảy ra trên các lượt tải xuống ứng dụng tự nhiên không?
Có. Các lượt tải xuống tự nhiên là mục tiêu thường xuyên của click injection. Khi một người dùng tự nhiên tìm kiếm và tải xuống một ứng dụng trên Google Play Store mà không nhấp vào quảng cáo, một ứng dụng độc hại trên thiết bị có thể phát hiện việc cài đặt và tiêm nhiễm một lượt nhấp giả mạo. Điều này đánh cắp quyền ghi nhận đóng góp từ kênh tự nhiên, khiến nhà quảng cáo phải trả tiền cho một mạng quảng cáo cho một lượt cài đặt tự nhiên.

Tóm tắt và Khung quyết định

Click injection đại diện cho một hình thức gian lận quảng cáo di động gây thiệt hại tài chính vì nó đánh cắp quyền ghi nhận đóng góp cho những người dùng thực tế, có ý định cao mà mức độ tương tác hạ nguồn của họ trông hoàn toàn bình thường. Việc dựa vào các chỉ số giữ chân sau cài đặt hoặc dấu thời gian nhấp chuột chưa được xác minh khiến các chiến dịch Android dễ bị tổn thương trước sự chiếm đoạt quyền ghi nhận.

Việc bảo vệ ngân sách marketing hiệu suất chống lại click injection đòi hỏi phải thực hiện một kiến trúc xác minh hai lớp: trích xuất các trường thời gian nền tảng thông qua Google Play Install Referrer API và thực thi các cửa sổ chiếm đoạt nhấp chuột thời gian thực tại cổng ghi nhận. Bằng cách kết hợp dữ liệu đo lường giới thiệu phía máy khách với các công cụ giám sát gian lận độc lập như OpoInstall, các đội ngũ tăng trưởng có thể xác định các sự đảo ngược thời gian, từ chối các yêu cầu nhấp chuột không hợp lệ theo các chính sách được định cấu hình và cải thiện niềm tin rằng ghi nhận đóng góp trả phí được gán cho các nguồn thu hút hợp pháp.

Để đánh giá cách thức ghi nhận đóng góp thống nhất và giám sát chống gian lận thời gian thực có thể bảo vệ các chiến dịch Android của bạn, hãy khám phá tài liệu tham khảo triển khai ghi nhận di động hoặc cấu hình ứng dụng của bạn trên bảng điều khiển nhà phát triển OpoInstall.

Tài liệu liên quan

Share this article