今天來講講手機app截圖安全性問題
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截圖偵測』即可通過此項目
偵測 userDidTakeScreenshotNotification
let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
print("擷取圖片")
}
iOS 無法做到,禁止截圖,只能通知使用者螢幕已經截圖
由於 Android 不像iOS 有系統級的方法可以偵測
因此只能土砲自行偵測,目前有兩種方式偵測截圖,另外一種是偵測鍵,但是因為廠商太多每支手機都不同因此可靠度太低
利用FileObserver監聽某個目錄中資源變化情況
利用ContentObserver監聽全部資源的變化
這邊說明用 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);
// 監聽到事件,做一些過濾去重處理操作
}
}
}
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