第一種使用者自定義的uri scheme形式如下:
第二種的intent-based uri的文法形式如下:
因為第二種形式大體是第一種形式的特例,是以很多文章又将第二種形式叫intent scheme url,但是在google的官方文檔并沒有這樣的說法。
注意:使用custom uri scheme給app傳遞資料,隻能使用相關參數來傳遞資料,不能想當然的使用scheme://host#intent;參數;end的形式來構造傳給app的intent資料。詳見3.1節的說明。
此外,還必須在app的androidmanifest檔案中配置相關的選項才能産生網頁打開app的效果,具體在下面講。
需求:使用網頁打開一個app,并通過url的參數給app傳遞一些資料。
如自定義的scheme為:
注意: uri要用utf-8編碼和uri編碼。
網頁端的寫法如下:
app端接收來自網頁資訊的activity,要在androidmanifest.xml檔案中activity的intent-filter中聲明相應action、category和data的scheme等。
如在mainactivity中接收從網頁來的資訊,其在androidmanifest.xml中的内容如下:
在mainactivity中接收intent并且擷取相應參數的代碼:
另外還有以下幾個api來擷取相關資訊:
getintent().getscheme(); //獲得scheme名稱
getintent().getdatastring(); //獲得uri全部路徑
getintent().gethost(); //獲得host
如果在app中,沒有檢查擷取到的load_url的值,攻擊者可以構造釣魚網站,誘導使用者點選加載,就可以盜取使用者資訊。
接2.1的示例,建立一個webviewactivity元件,從intent裡面擷取load_url,然後使用webview加載url:
修改mainactivity元件,從網頁端的url中擷取load_url參數的值,生成新的intent,并傳給webviewactivity:
網頁端:
釣魚頁面:
點選“打開釣魚網站”,進入app,并且app加載了釣魚網站:
本例建議:
在webview加載load_url時,結合app的自身業務采用白名單機制過濾網頁端傳過來的資料,黑名單容易被繞過。
1、app中任何接收外部輸入資料的地方都是潛在的攻擊點,過濾檢查來自網頁的參數。
2、不要通過網頁傳輸敏感資訊,有的網站為了引導已經登入的使用者到app上使用,會使用腳本動态的生成url scheme的參數,其中包括了使用者名、密碼或者登入态token等敏感資訊,讓使用者打開app直接就登入了。惡意應用也可以注冊相同的url sechme來截取這些敏感資訊。android系統會讓使用者選擇使用哪個應用打開連結,但是如果使用者不注意,就會使用惡意應用打開,導緻敏感資訊洩露或者其他風險。
intent-based uri文法:
注意:第二個intent的第一個字母一定要大寫,不然不會成功調用app。
如何正确快速的構造網頁端的intent?
可以先建個android demo app,按正常的方法構造自己想打開某個元件的intent對象,然後使用intent的touri()方法,會得到intent對象的uri字元串表示,并且已經用utf-8和uri編碼好,直接複制放到網頁端即可,切記前面要加上“intent:”。
如:
結果:
s.load_url是跟的是intent對象的putextra()方法中的資料。其他類型的資料可以一個個試。如果在demo中的intent對象不能傳遞給目标app的activity或其他元件,則其uri形式放在網頁端也不可能打開app的,這樣寫個demo容易排查錯誤。
app端中的androidmanifest.xml的聲明寫法同2.1節中的app端寫法完全一樣。對于接收到的uri形式的intent,一般使用intent的parseuri()方法來解析産生新的intent對象,如果處理不當會産生intent scheme url攻擊。
為何不能用scheme://host#intent;參數;end的形式來構造傳給app的intent資料?
這種形式的intent不會直接被android正确解析為intent,整個scheme字元串資料可以使用intent的getdatasting()方法擷取到。
如對于:
在app中擷取資料:
結果是:
由上圖可知android系統自動為custom uri scheme添加了預設的intent。
要想正确的解析,還需使用intent的parseuri()方法對getdatastring()擷取到的資料進行解析,如:
上面兩篇文章中都給出了安全使用intent scheme url的方法:
除了以上的做法,還是不要信任來自網頁端的任何intent,為了安全起見,使用網頁傳過來的intent時,還是要進行過濾和檢查。