版權聲明:html
本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。安全
未經容許,不得轉載。微信
在咱們開發一些對屏幕顯示內容的安全性有要求的 App 的時候,若是後臺有運行惡意的程序對這些敏感頁面進行截圖,就可能致使這些信息的泄露。ide
比較常見的場景,就是微信或者支付寶的付款二維碼,若是有惡意程序此時進行截圖而且發送出去,就可能致使用戶經濟上的損失。測試
那麼本片文章就如何防止在某些頁面內截圖的問題,進行一個詳盡的討論。動畫
首先須要明確,防止截屏的功能,通常而言都是對 App 內單個頁面的,全局禁用也沒什麼,還可能不利於用戶分享傳播,一般咱們只須要對敏感頁面進行限制便可。3d
這些敏感信息,一方面來自程序根據用戶信息,自動生成的,例如前面舉例的付款二維碼。另一方面,來自用戶的主動錄入,例如用戶本身輸入的賬號、密碼(有些爲了怕用戶輸入錯誤,有提供顯示密碼的開關)。code
因此咱們就這兩種思路來進行分別的討論。cdn
對於這種程序自動生成的信息,在開發者看來,只須要保證截屏,截取到的信息是髒數據便可。就是說截屏保存的數據,實際上是已經失效或者過時的便可。server
可是對於 Android 系統而言,截屏並無提供對應的廣播或者其它回調來監聽它,咱們只能經過其餘的方式來解決它。
如今主流的一些思路:
這些思路都是依賴於對方使用的是系統本身提供的截圖方式,可能並不能詳盡的覆蓋到。例如第一種方法,在 onPause() 中刷新數據,其實就是利用了設備在截屏的時候,爲了讓用戶有感知,因此會有一個截圖的動畫效果來提示用戶已經截圖成功,在此處被截屏的 Activity 就會走到 onPause() 生命週期內。可是有一些軟件的截圖方式,是不會有此動畫的,因此徹底會致使監聽不到而致使信息泄露。
不過這種思路,不是本文的重點,本文的重點主要是第二種方式,這裏只是簡單介紹一下,以後有時間再作一個詳情的講解。
對於用戶主動錄入的信息,通常而言,哪怕咱們能夠經過第一種方式去修改它,也會很麻煩,最直接的辦法,是看能不能直接禁用掉截屏的功能。
實際上,Android 是提供了對應的 Api 的,使用起來也很是的簡單,只須要拿到 window 對象,對其添加一個 FLAG_SECURE
的 flag 便可。
完整的代碼以下:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
這裏的 window 對象,能夠是 Activity.getWindow()
獲取的,也能夠是 Dialog.getWindow()
獲取的,獲取 window 的方式不少,這裏就不一一舉例了。只是使用不一樣對象獲取到的 Window 對象,禁用截屏的區域也不一樣。
大部分狀況下都推薦使用這種方法,禁用掉系統截屏的功能,一勞永逸。
FLAG_SECURE 是 WindowManager.LayoutParams
的一個屬性,從文檔上就能夠看出來,它標記當前 window 是安全的,不容許有一些非安全的操做,例如截屏功能。
雖然 FLAG_SECURE
是一個官方推薦的 Flag ,可是咱們仍是須要測試一下是否靠譜。
測試設備 :Letv X600 Android 6.0
首先使用 Android Monitor 進行截圖。
以後查閱了一些資料,在一些設備上也有一些不一樣的表現,例如,在三星手機上測試,發現會輸出一個圖片文件,可是內容被像素化了,以下圖所示。
FLAG_SECURE
基本上能夠保證咱們顯示的內容的安全性。可是有一些狀況下 ,
FLAG_SECURE
依然會有一些截屏泄露的狀況。
由於 FLAG_SECURE
是應用在 Window 對象上的,若是在 Activity 中有一些彈窗或者突出的UI元素,都是不受 Activity 的 Window 對象保護的。例如:在Activity 中彈出對話框,雖然 Activity 被設置爲 FLAG_SECURE
,可是若是有一個 Dialog 彈窗,對於彈窗的內容,依然須要單獨設置 FLAG_SECURE
。
這些會出現截屏泄露的地方包括:
這些只是一部分,可能還有其餘的地方也會形成截屏泄露。
下面展現一個在 @CommonsWare 博客中找到的 gif 圖,能夠清晰代表在這些狀況下,依然是能夠截取到內容的,因此咱們在有重要信息須要隱藏的時候,要特別注意這些場景下也別暴露重要信息。
能夠看到,在一個被設置爲 FLAG_SECURE 的頁面中,有些設備上依然會截取出黑色的畫面,而這些致使截屏泄露的點,依然是能夠截取到圖像的。
@CommonsWare 的博客地址:
其實通篇就是在介紹一個 FLAG_SECURE 這個 flag 來保護屏幕的安全,禁止程序進行截屏,可是引伸出一些值得咱們思考的問題。