漫畫(huà):App 防止 Fiddler 抓包小技巧!
判斷當(dāng)前系統(tǒng)是否掛代理
獲取當(dāng)前系統(tǒng)是否設(shè)置代理,可以根據(jù)不同的 Api Level,分別通過(guò) 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
- }
通過(guò) Log,就可以看到當(dāng)前設(shè)備,在 WiFi 中,掛的代理的 IP 和 Port 了。
拒絕發(fā)請(qǐng)求的缺點(diǎn)
若判斷當(dāng)前環(huán)境,被掛了代理就拒絕請(qǐng)求,其實(shí)是一個(gè)非常不友好的操作。
首先你需要有效的提醒用戶,去正確的設(shè)置 WiFi 的代理;其次,總有一些特殊的情況,用戶需要在手機(jī)上掛代理,可能不是針對(duì)你的 App,總不能讓你的 App 和當(dāng)前代理在用戶眼里“不兼容”吧!
設(shè)置不使用代理
Fiddler 和 Charles 這類抓包工具,本質(zhì)上就是利用中間人攻擊的方式,通過(guò)這個(gè)中間人獲取到通信的數(shù)據(jù)。
而利用這些工具抓包的前提,都是在設(shè)備上,設(shè)置代理,通常我們直接在 WiFi 連接頁(yè)面,設(shè)置代理即可。
而對(duì)于一些常用的網(wǎng)絡(luò)庫(kù),其實(shí)是提供了我們?cè)O(shè)置的代理的接口,我們只需要將其設(shè)置成無(wú)代理的模式,它就不會(huì)去應(yīng)用系統(tǒng)默認(rèn)的代理了。
就拿比較常用的 OkHttp 來(lái)舉例,在初始化的時(shí)候,就可以通過(guò) proxy() 方法,為 OkHttp 設(shè)置一個(gè)代理。
- 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)
例如這里,我們對(duì)其設(shè)置為不使用代理的模式,它就不會(huì)從系統(tǒng)中,讀取代理信息,進(jìn)行網(wǎng)絡(luò)請(qǐng)求。而是會(huì)忽略掉它,直接發(fā)送網(wǎng)絡(luò)請(qǐng)求。以這樣的方式,就可以阻止第三方使用 Fiddler 或 Charles 進(jìn)行抓包。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)聯(lián)系作者獲取授權(quán)】