漫畫:App 防止 Fiddler 抓包小技巧!
判斷當前系統(tǒng)是否掛代理
獲取當前系統(tǒng)是否設置代理,可以根據(jù)不同的 Api Level,分別通過 System.getProperty() 和 android.net.proxy.getXxx() 方法獲取到。
- private fun checkWifiProxy(): Boolean {
- val IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH
- val proxyAddress: String?
- val proxyPort: Int?
- if (IS_ICS_OR_LATER) {
- proxyAddress = System.getProperty("http.proxyHost")
- val portStr = System.getProperty("http.proxyPort")
- proxyPort = Integer.parseInt(portStr ?: "-1")
- } else {
- proxyAddress = android.net.Proxy.getHost(this)
- proxyPort = android.net.Proxy.getPort(this)
- }
- Log.i("cxmyDev","proxyAddress : ${proxyAddress}, prot : ${proxyPort}")
- return !TextUtils.isEmpty(proxyAddress) && proxyPort != -1
- }
通過 Log,就可以看到當前設備,在 WiFi 中,掛的代理的 IP 和 Port 了。
拒絕發(fā)請求的缺點
若判斷當前環(huán)境,被掛了代理就拒絕請求,其實是一個非常不友好的操作。
首先你需要有效的提醒用戶,去正確的設置 WiFi 的代理;其次,總有一些特殊的情況,用戶需要在手機上掛代理,可能不是針對你的 App,總不能讓你的 App 和當前代理在用戶眼里“不兼容”吧!
設置不使用代理
Fiddler 和 Charles 這類抓包工具,本質上就是利用中間人攻擊的方式,通過這個中間人獲取到通信的數(shù)據(jù)。
而利用這些工具抓包的前提,都是在設備上,設置代理,通常我們直接在 WiFi 連接頁面,設置代理即可。
而對于一些常用的網(wǎng)絡庫,其實是提供了我們設置的代理的接口,我們只需要將其設置成無代理的模式,它就不會去應用系統(tǒng)默認的代理了。
就拿比較常用的 OkHttp 來舉例,在初始化的時候,就可以通過 proxy() 方法,為 OkHttp 設置一個代理。
- var httpBuilder = OkHttpClient.Builder()
- .addInterceptor(defaultInterceptor())
- .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .readTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .proxy(Proxy.NO_PROXY)
例如這里,我們對其設置為不使用代理的模式,它就不會從系統(tǒng)中,讀取代理信息,進行網(wǎng)絡請求。而是會忽略掉它,直接發(fā)送網(wǎng)絡請求。以這樣的方式,就可以阻止第三方使用 Fiddler 或 Charles 進行抓包。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉載請通過微信公眾號聯(lián)系作者獲取授權】