閱後即焚?就問截屏你怕不怕?

版權聲明:html

本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。安全

未經容許,不得轉載。微信

1、前言

在咱們開發一些對屏幕顯示內容的安全性有要求的 App 的時候,若是後臺有運行惡意的程序對這些敏感頁面進行截圖,就可能致使這些信息的泄露。ide

比較常見的場景,就是微信或者支付寶的付款二維碼,若是有惡意程序此時進行截圖而且發送出去,就可能致使用戶經濟上的損失。測試

那麼本片文章就如何防止在某些頁面內截圖的問題,進行一個詳盡的討論。動畫

2、防止截屏思路

首先須要明確,防止截屏的功能,通常而言都是對 App 內單個頁面的,全局禁用也沒什麼,還可能不利於用戶分享傳播,一般咱們只須要對敏感頁面進行限制便可。3d

這些敏感信息,一方面來自程序根據用戶信息,自動生成的,例如前面舉例的付款二維碼。另一方面,來自用戶的主動錄入,例如用戶本身輸入的賬號、密碼(有些爲了怕用戶輸入錯誤,有提供顯示密碼的開關)。code

因此咱們就這兩種思路來進行分別的討論。cdn

一、程序自動生成的信息(二維碼)

對於這種程序自動生成的信息,在開發者看來,只須要保證截屏,截取到的信息是髒數據便可。就是說截屏保存的數據,實際上是已經失效或者過時的便可。server

可是對於 Android 系統而言,截屏並無提供對應的廣播或者其它回調來監聽它,咱們只能經過其餘的方式來解決它。

如今主流的一些思路:

  1. 在 Activity.onPause() 中,刷新數據。
  2. 利用 FileObserver 監聽截屏目錄中,截圖文件的變化狀況。
  3. 利用 ContentObserver 監聽所有資源的變化。

這些思路都是依賴於對方使用的是系統本身提供的截圖方式,可能並不能詳盡的覆蓋到。例如第一種方法,在 onPause() 中刷新數據,其實就是利用了設備在截屏的時候,爲了讓用戶有感知,因此會有一個截圖的動畫效果來提示用戶已經截圖成功,在此處被截屏的 Activity 就會走到 onPause() 生命週期內。可是有一些軟件的截圖方式,是不會有此動畫的,因此徹底會致使監聽不到而致使信息泄露。

不過這種思路,不是本文的重點,本文的重點主要是第二種方式,這裏只是簡單介紹一下,以後有時間再作一個詳情的講解。

二、用戶錄入的信息

對於用戶主動錄入的信息,通常而言,哪怕咱們能夠經過第一種方式去修改它,也會很麻煩,最直接的辦法,是看能不能直接禁用掉截屏的功能。

實際上,Android 是提供了對應的 Api 的,使用起來也很是的簡單,只須要拿到 window 對象,對其添加一個 FLAG_SECURE 的 flag 便可。

完整的代碼以下:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

這裏的 window 對象,能夠是 Activity.getWindow() 獲取的,也能夠是 Dialog.getWindow() 獲取的,獲取 window 的方式不少,這裏就不一一舉例了。只是使用不一樣對象獲取到的 Window 對象,禁用截屏的區域也不一樣。

大部分狀況下都推薦使用這種方法,禁用掉系統截屏的功能,一勞永逸。

FLAG_SECUREWindowManager.LayoutParams 的一個屬性,從文檔上就能夠看出來,它標記當前 window 是安全的,不容許有一些非安全的操做,例如截屏功能。

3、使用 FLAG_SECURE 靠譜嗎?

雖然 FLAG_SECURE 是一個官方推薦的 Flag ,可是咱們仍是須要測試一下是否靠譜。

測試設備 :Letv X600 Android 6.0

首先使用 Android Monitor 進行截圖。


發現是會截圖失敗的,以下圖所示,提示截圖失敗。


而後再使用手機自帶的截圖快捷鍵試試,一樣會提示截圖失敗。


如今來看,這個 Flag 基本上是靠譜。

以後查閱了一些資料,在一些設備上也有一些不一樣的表現,例如,在三星手機上測試,發現會輸出一個圖片文件,可是內容被像素化了,以下圖所示。


從自測和資料上來看, FLAG_SECURE 基本上能夠保證咱們顯示的內容的安全性。可是有一些狀況下 , FLAG_SECURE 依然會有一些截屏泄露的狀況。

由於 FLAG_SECURE 是應用在 Window 對象上的,若是在 Activity 中有一些彈窗或者突出的UI元素,都是不受 Activity 的 Window 對象保護的。例如:在Activity 中彈出對話框,雖然 Activity 被設置爲 FLAG_SECURE,可是若是有一個 Dialog 彈窗,對於彈窗的內容,依然須要單獨設置 FLAG_SECURE

這些會出現截屏泄露的地方包括:

  • AutoCompleteTextView
  • Spinner(下拉菜單或者對話框模式中)
  • PopupWindow
  • ShareActionProvider
  • Toast

這些只是一部分,可能還有其餘的地方也會形成截屏泄露。

下面展現一個在 @CommonsWare 博客中找到的 gif 圖,能夠清晰代表在這些狀況下,依然是能夠截取到內容的,因此咱們在有重要信息須要隱藏的時候,要特別注意這些場景下也別暴露重要信息。

能夠看到,在一個被設置爲 FLAG_SECURE 的頁面中,有些設備上依然會截取出黑色的畫面,而這些致使截屏泄露的點,依然是能夠截取到圖像的。

@CommonsWare 的博客地址:

commonsware.com/blog/2016/0…

4、總結

其實通篇就是在介紹一個 FLAG_SECURE 這個 flag 來保護屏幕的安全,禁止程序進行截屏,可是引伸出一些值得咱們思考的問題。

相關文章
相關標籤/搜索