IOS 截圖是系統層級因此安全問題不大,但還是需要適時提醒使用者

在Android 上可就要小心了,若是下載到惡意 App 也可以使用者截圖盜走

因此在包含個人資訊,付款資訊上的頁面就要慎重的處理

資安檢測-安全敏感性資料保護複習

我們在 Day 07. 資安檢測 (II) 4.1.2 安全敏感性資料保護

裡面有一點 4.1.2.3.9 行動應用程式畫面擷取警示

其中行動應用程式於 非使用者主動進行 的畫面擷取時應主動警示使用者

主要針對 Android 系統,系統被背景命令觸發時發動的截圖

但在Android 系統命令觸發時,App內並無手段可以偵測 adb shell screencap

adb shell screencap - p /sdcard/Download/1.png

上行程式碼為在debug模式並執行程式碼, 若可以正常被截圖,此項目就會視為不符合

由於這條很靠北特別,只能在有帳密個資等全部頁面加上 FLAG_SECURE,才能通過檢驗『Android 禁止截圖』

iOS 需做到截圖時通知使用者『iOS截圖偵測』即可通過此項目

IOS 截圖偵測

偵測 userDidTakeScreenshotNotification

let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
    print("擷取圖片")

iOS 無法做到,禁止截圖,只能通知使用者螢幕已經截圖

Android 偵測截圖

由於 Android 不像iOS 有系統級的方法可以偵測

因此只能土砲自行偵測,目前有兩種方式偵測截圖,另外一種是偵測鍵,但是因為廠商太多每支手機都不同因此可靠度太低

利用FileObserver監聽某個目錄中資源變化情況

  • 所需權限:READ_EXTERNAL_STORAGE

    這邊說明用 FileObserver 為例

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    public class ScreenshotActivity extends AppCompatActivity {
      private final String TAG = "Screenshot";
      private static final String PATH = Environment.getExternalStorageDirectory()   File.separator 
      Environment.DIRECTORY_PICTURES   File.separator   "Screenshots"   File.separator;
      protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screenshot);
        mFileObserver = new CustomFileObserver(PATH);
      @Override
      protected void onResume() {
        super.onResume();
        mFileObserver.startWatching();
        Log.d(TAG, PATH);
      @Override
        protected void onStop() {
        super.onStop();
        mFileObserver.stopWatching();
      * 目錄監聽器
      private class CustomFileObserver extends FileObserver {
        private String mPath;
        public CustomFileObserver(String path) {
        super(path);
        this.mPath = path;
      public CustomFileObserver(String path, int mask) {
        super(path, mask);
        this.mPath = path;
      @Override
      public void onEvent(int event, String path) {
        Log.d(TAG, path   " "   event);
        // 監聽到事件,做一些過濾去重處理操作
    

    Android 禁止截圖

    FLAG_SECURE Android 官方文件說明

    FLAG_SECURE 是 WindowManager.LayoutParams 的一個屬性

    它標記當前 window 是安全的,不允許有一些非安全的操作,例如截圖功能。

    FLAG_SECURE flag 設定後會有以下功能:

    阻止螢幕截圖

    在Recent apps(任務切換介面)中只顯示應用名字和圖示, 不顯示內容

    Google App的Now on tap功能不會去分析你的頁面的內容

    getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
    
    window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);
    

    https://developer.android.com/reference/android/view/WindowManager.LayoutParams

    https://medium.com/swlh/how-to-make-your-ios-app-secure-from-screen-shot-and-recording-82b6aea26b33

    https://www.itread01.com/fxefy.html

  •