Android安全開發之Provider元件安全

2021-08-27 23:28:12 字數 1939 閱讀 9764

**:android安全開發之provider元件安全

注意:由於android元件content provider無法在android 2.2(即api level 8)系統上設為不匯出,因此建議宣告最低sdk版本為8以上版本(這已經是好幾年前的sdk了,現在一般都會大於此版本);

由於api level 在17以下的所有應用的「android:exported」屬性預設值都為true,因此如果應用的content provider不必要匯出,建議顯式設定註冊的content provider元件的「android:exported」屬性為false;

如果必須要有資料提供給外部應用使用,則做好設計,做好許可權控制,明確什麼樣的外部應用可以使用,如對於本公司的應用在許可權定義時用相同簽名即可,合作方的應用檢查其簽名;不過還是盡量不提供使用者隱私敏感資訊。

對於必須暴露的provider,如第二部分遇到的風險解決辦法如下:

在androidmanifest中定義私有許可權的語法為:

其中android:protectionlevel的可選值分別表示:

dangerous:高風險許可權,如發簡訊,打**,讀寫通訊錄。使用此protectionlevel來標識使用者可能關注的一些許可權。android將會在安裝程式時,警示使用者關於這些許可權的需求,具體的行為可能依據android版本或者所安裝的移動裝置而有所變化。

注意:一定不要使用拼接來組裝sql語句。

如果content provider的資料來源是sqlite資料庫,如果使用拼接字串的形式組成原始sql語句執行,則會導致sql注入。

如下的選擇子句:

如果執行此操作,則會允許使用者將惡意 sql 串連到 sql 語句上。

例如,使用者可以為 muserinput 輸入「nothing; drop table ** ; 」,這會生成選擇子句

var = nothing; drop table **;

由於選擇子句是作為sql語句處理,因此這可能會導致提供程式擦除基礎 sqlite 資料庫中的所有表(除非提供程式設定為可捕獲 sql 注入嘗試)。

使用引數化查詢:

要避免此問題,可使用乙個「 ? 」 作為可替換引數的選擇子句以及乙個單獨的選擇引數陣列。

執行此操作時,使用者輸入直接受查詢約束,而不解釋為 sql 語句的一部分。

由於使用者輸入未作為 sql 處理,因此無法注入惡意 sql。

請使用此選擇子句,而不要使用串連來包括使用者輸入:

string mselectionclause = 「var = ?」;

按如下所示設定選擇引數陣列:

string selectionargs = ;

按如下所示將值置於選擇引數陣列中:

selectionargs[0] = muserinput;

還可呼叫sqlitedatabase類中的引數化查詢query()方法:

1、去除content provider中沒有必要的openfile()介面。

2、過濾限制跨域訪問,對訪問的目標檔案的路徑進行有效判斷:

使用uri.decode()先對content query uri進行解碼後,再過濾如可通過「../」實現任意可讀檔案的訪問的uri字串,如:

[1]《內容提供程式基礎知識

》[3]《android - content providers》

[4][5]

[6][7]

[8][9] 《android content provider security》

[10]

[11]《android content provider security

》[12]

[13]

[14] 《content provider檔案目錄遍歷漏洞**》,

[15]

移動安全 49 Android安全開發編碼規範

平台使用不當包涵android控制項的配置不當或編碼不當。包括activity service contentprovider broadcast receiver intent元件 webview元件使用過程中配置是否規範與編碼是否規範。平台使用不當會造成的風險包括元件被惡意呼叫 惡意傳送廣播 惡...

安全開發流程(SDL)

目錄 0x01 sdl介紹 0x02 sdl流程框架 0x03 sdl實戰經驗 0x04 總結 安全開發生命週期 sdl 即security development lifecycle,是乙個幫助開發人員構建更安全的軟體和解決安全合規要求的同時降低開發成本的軟體開發過程。自2004年起,sdl就成為...

Servlet執行緒安全開發注意事項

1.盡可能在servlet中使用本地變數 2.應該只使用制度的例項變數和靜態變數 3.不要再servlet中建立自動的執行緒 4.修改共享物件,一定要使用同步,盡可能縮小同步 的範圍,從效能角度考慮,不要再方法粒度上同步。5.不同的servlet,對外部物件進行修改,要做加鎖操作。6.使用同步的集合...