Android 開發之避免被第三方使用代理抓包


現象:charles抓不到包,但wireshark,HttpAnalyzor可以抓到包。

關鍵代碼:

 

[java]  view plain  copy
 
  1. URL url = new URL(urlStr);  
  2. urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);  

 

[java]  view plain  copy
 
  1. OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();  

Android 如果防止APK被抓包工具抓包

轉:http://blog.csdn.net/a6136581/article/details/72627026

平時都是用Fiddler對Android應用進行抓包,如果對Fiddler不熟悉,可以點擊查看Fiddler抓包方法。在抓抱前,需要將手機的WiFi進行代理設置,然后才能在電腦上使用Fiddler成功抓包,那么我們試想一下,如果在APP請求網絡之前先判斷下手機網絡是否使用了代理,如果使用了代理就不請求接口。新的問題來了,在Android手機中如何知道手機網絡是否使用了代理?

代碼實踐

 

經過查找資料與實踐,發現如下的代碼能夠滿足需求:

[java]  view plain  copy
 
  1. private boolean isWifiProxy() {  
  2.     final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;  
  3.     String proxyAddress;  
  4.     int proxyPort;  
  5.     if (IS_ICS_OR_LATER) {  
  6.        proxyAddress = System.getProperty("http.proxyHost");  
  7.        String portStr = System.getProperty("http.proxyPort");  
  8.        proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));  
  9.     } else {  
  10.        proxyAddress = android.net.Proxy.getHost(this);  
  11.        proxyPort = android.net.Proxy.getPort(this);  
  12.     }  
  13.     return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);  
  14.   }  

 

JAVA基礎知識之網絡編程——-使用Proxy創建連接

轉:https://www.cnblogs.com/fysola/p/6089416.html

 

在前面的HTTP網絡通信的例子中,使用了URLConnection conn = url.openConnection();連接網絡,

如果改用URLConnection conn = url.openConnection(proxy);方式,傳入一個proxy對象,設置好代理IP和端口,則可以實現代理連接,

下面是一個簡單例子,

 

[java]  view plain  copy
 
  1. package proxy;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintStream;  
  5. import java.net.InetSocketAddress;  
  6. import java.net.MalformedURLException;  
  7. import java.net.Proxy;  
  8. import java.net.URL;  
  9. import java.net.URLConnection;  
  10. import java.util.Scanner;  
  11.   
  12. public class ProxyTest {  
  13.     final String PROXY_ADDR = "172.20.230.5";  
  14.     final int PROXY_PORT = 3128;  
  15.     String urlStr = "http://www.baidu.com";  
  16.     //String urlStr = "http://www.crazyit.org";  
  17.       
  18.     public void init() throws IOException {  
  19.         URL url = new URL(urlStr);  
  20.         Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT));  
  21.         //使用代理服務器打開鏈接  
  22.         URLConnection conn = url.openConnection(proxy);  
  23.         //URLConnection conn = url.openConnection();  
  24.         conn.setConnectTimeout(5000);  
  25.         try {  
  26.             Scanner scan = new Scanner(conn.getInputStream());  
  27.             PrintStream ps = new PrintStream("index.html");  
  28.             while (scan.hasNextLine()) {  
  29.                 String line = scan.nextLine();  
  30.                 System.out.println(line);  
  31.                 ps.println(line);  
  32.             }  
  33.         } catch (IOException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.       
  38.     public static void main(String[] args) throws IOException {  
  39.         new ProxyTest().init();  
  40.     }  
  41. }  


實現自動代理

在上面的例子中,每次用url對象open一個connection的時候,都需要顯示地傳入一個proxy對象才行。

而實際上可以在connection之前,做一個默認代理設置,這樣以后再openConnection的時候,就不需要顯示傳入proxy對象了。

做默認代理設置需要重寫ProxySelector的select方法,返回代理IP和端口列表,具體實現如下,

[java]  view plain  copy
 
  1. package proxy;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintStream;  
  5. import java.net.InetSocketAddress;  
  6. import java.net.MalformedURLException;  
  7. import java.net.Proxy;  
  8. import java.net.ProxySelector;  
  9. import java.net.SocketAddress;  
  10. import java.net.URI;  
  11. import java.net.URL;  
  12. import java.net.URLConnection;  
  13. import java.util.ArrayList;  
  14. import java.util.List;  
  15. import java.util.Scanner;  
  16.   
  17. public class ProxyTest {  
  18.     final String PROXY_ADDR = "172.20.230.5";  
  19.     final int PROXY_PORT = 3128;  
  20.     String urlStr = "http://www.baidu.com";  
  21.     //String urlStr = "http://www.crazyit.org";  
  22.       
  23.     public void init() throws IOException {  
  24.         ProxySelector.setDefault(new ProxySelector(){  
  25.   
  26.             @Override  
  27.             public void connectFailed(URI arg0, SocketAddress arg1,  
  28.                     IOException arg2) {  
  29.                 System.out.println("無法連接到服務器");  
  30.                   
  31.             }  
  32.   
  33.             @Override  
  34.             public List<Proxy> select(URI uri) {  
  35.                 List<Proxy> result = new ArrayList<>();  
  36.                 result.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT)));  
  37.                 return result;  
  38.             }  
  39.               
  40.         });  
  41.           
  42.         URL url = new URL(urlStr);  
  43.         //使用代理服務器打開鏈接  
  44.         URLConnection conn = url.openConnection();  
  45.         conn.setConnectTimeout(5000);  
  46.         try {  
  47.             Scanner scan = new Scanner(conn.getInputStream());  
  48.             PrintStream ps = new PrintStream("index.html");  
  49.             while (scan.hasNextLine()) {  
  50.                 String line = scan.nextLine();  
  51.                 System.out.println(line);  
  52.                 ps.println(line);  
  53.             }  
  54.         } catch (IOException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.     }  
  58.       
  59.     public static void main(String[] args) throws IOException {  
  60.         new ProxyTest().init();  
  61.     }  
  62. }  


可以看到使用代理之后,再用url打開鏈接時就能像普通連接那樣url.openConnection();了

 

 

 

Android 開發之避免被第三方使用代理抓包                   

轉:http://blog.csdn.net/a807891033/article/details/53643550

  最近遇到一個問題,手機wifi設置了一個可用代理后,然后再到自己的應用中耍,發現了一個大悲劇,

 就是所有接口都訪問不了,全部進了異常中,瞬間就兩眼淚汪汪了,后來問了度娘,給出的一個還能用的

 解釋:

 

[java]  view plain  copy
 
  1. System.getProperties().remove("http.proxyHost");    
  2. System.getProperties().remove("http.proxyPort");    
  3. System.getProperties().remove("https.proxyHost");    
  4. System.getProperties().remove("https.proxyPort");    
       每錯,這就是移除所有代理,但問題是如果移除全部,那蝸牛其他的功能就必會受一些影響,沒辦法,只能

 

自己去看SDK,果然,Android是提供單個接口訪問不帶代理的,不廢話,上代碼

 

[java]  view plain  copy
 
  1. URL url = new URL(urlStr);  
  2. urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);  

嗯,很實在,然后蝸牛又去看了一下OKhttp框架是否提供類似的操作,·······果然不愧是好框架:

 

 

[java]  view plain  copy
 
  1. OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();  

   好了,蝸牛就只弄了這點,有錯請指出!!!!

自己調試的界面:  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM