拦截 Android 应用发送的 HTTP 请求

Posted

技术标签:

【中文标题】拦截 Android 应用发送的 HTTP 请求【英文标题】:Intercept HTTP requests sent from Android app 【发布时间】:2012-09-09 09:11:13 【问题描述】:

我有申请。我知道所有 url、参数、http 请求类型等(这是我的应用程序)。

如何拦截来自应用程序的所有请求?例如 - 我按下了一个按钮,可以看到对服务器的请求文本。

任务 - 隐藏潜在黑客的请求并阻止他代表应用程序执行请求。

【问题讨论】:

我建议使用 https 或其他加密来隐藏潜在黑客的请求。 【参考方案1】:

据我了解,您的问题包含两个问题:

如何检查服务器和客户端之间的流量。

随着努力的增加,有几种可能性:

日志记录:因为它是您的应用程序,您可以在调用 http 请求之前插入包含查询和参数的日志记录语句。 监听服务器端:因为它是您的应用程序,您也可以控制服务器。使用tcpdump 之类的工具,您应该能够转储流量并稍后对其进行分析(例如使用Wireshark) 监听客户端:如果您想拦截客户端中或“旁边”的流量,您可以尝试使用burpsuite 使用代理或直接在您的 WIFI 中拦截流量。

如何确保只有您的客户可以向服务器发出请求。 我建议使用带有客户端身份验证的 https。您必须使用您的应用程序推出客户端证书,然后您的服务器可能会检查您的客户端的真实性。 Here你可以找到相互ssl认证的一般介绍。

【讨论】:

【参考方案2】:

您并没有在您的问题中真正说明为什么您要这样做,但对其他人来说:想要这样做的最佳动机是因为您担心您的应用是攻击者的目标,因为他们以某种方式强迫您的 Intent(或其他 RPC 接口)行为不端。

我可以说做到这一点的最佳方式是为您的应用提供尽可能有限的接口:不要允许面向公众的意图或 RPC 接口操纵您的应用以发送您不想要的信息。

此外,您可以将发送到服务器的 HTTP 请求记录(可能通过应用程序中的包装器到 HTTP 设施)。问题是,一旦您将信息记录在客户的设备上,您打算用它做什么。能够正确识别应用程序何时做“坏”的事情几乎是不可能的,并且预设了对“坏”的定义,所以这是错误的追求。

因此,即使您可以登录,并且即使您可以使用 HTTPS,我也会说您应该调查攻击者可以用来操纵您的应用程序以将数据发送到您的网络服务的所有途径:从您的位置开始实际发送数据并通过应用程序向后工作!

【讨论】:

【参考方案3】:

您可以加密消息以防止黑客入侵。如果客户端和服务器都在您的控制之下,那么您可以使用任何密钥加密技术。这仅适用于私有 HTTP 客户端(如 android 应用程序)。但对于浏览器等通用 HTTP 客户端,您应该使用 HTTPS(HTTP + SSL)而不是 HTTP。

【讨论】:

【参考方案4】:

扩展WebViewClient,我覆盖了shouldOverrideUrlLoading方法如下:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) 

    String mainPage = "https://www.secureSite.com/myData/";

    if (url.startsWith(mainPage)) 
        view.loadUrl(url);
        return false;

     else 

         //some dialog building code here

         view.stopLoading();
         return false;
    
 // end-of-method shouldOverrideUrlLoading

因此,这段代码的重点在于它评估您的应用开始加载的每个 URL。如果用户找到一个链接或尝试加载他们自己的不属于您的域/指定 URL 的 URL,那么它将不匹配并且不会加载。

但是在你的 android manifest 中,你应该将android:exported 属性设置为false 以防止其他应用程序使用它。

下面引用here:

android:exported 其他应用程序的组件是否可以调用服务或与之交互——如果可以,则为“true”,否则为“false”。当值为“false”时,只有相同应用的组件或具有相同用户ID的应用才能启动服务或绑定服务。

默认值取决于服务是否包含意图过滤器。没有任何过滤器意味着它只能通过指定其确切的类名来调用。这意味着该服务仅供应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,存在至少一个过滤器意味着该服务是供外部使用的,因此默认值为“true”。

此属性不是限制服务向其他应用程序公开的唯一方法。您还可以使用权限来限制可以与服务交互的外部实体(请参阅权限属性)。

此属性也可用于ActivityProvider。 Here(活动)和here(提供者)是参考,但它与Service描述几乎一字不差,只需将ActivityProvider替换为Service

【讨论】:

以上是关于拦截 Android 应用发送的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

androidpost添加到请求头

如何让 Fiddler\其他应用程序自动拦截和修改 HTTP 请求参数?

axios的应用

如何监控android网络请求

http拦截器interceptors

如何拦截webview的post请求