繁体   English   中英

确定 HTTP 是否从 Android App 请求? 然后适当地回应

[英]Identify whether HTTP requests from Android App or not? and then respond appropriately

我的 Android 应用程序有一个与之关联的应用程序小部件,它在 Android 设备上每 10 分钟更新一次。 这些更新向服务器发送 HTTP 数据请求并解析服务器响应并根据需要更新应用程序。

到目前为止,如果您从笔记本电脑或 PC 上的浏览器 ping URL,服务器将响应并更新服务器数据库中所需的任何内容。

我想要做的是当服务器收到 HTTP 请求时,我想确定该请求是否来自我的 Android 应用程序,来自 Android 设备,然后响应数据。 如果 HTTP 请求来自浏览器或除我的 Android 应用程序以外的其他任何东西,我想更改服务器上 PHP 中的代码,以便它们显示或重定向到某个页面。

来自应用程序的典型 HTTP 请求类似于http://example.com/abc.php?usera=abc&datab=xyz

如果这个 URL 来自除 Android 应用程序之外的任何其他地方,我不想以同样的方式回应它。 这可能吗? 什么是实现这一目标的好方法..

谢谢你的帮助。

您可以在请求中添加签名,然后在服务器端进行检查。

只需查询并在末尾添加一个秘密词,然后制作一个 MD5,您可以将其作为 header 发送(或用作用户代理)。 在服务器上你也这样做并检查校验和是否相同。

为了让它更安全一点,您可以制作一个时间戳,这样请求只会在短时间内有效。

使您的查询看起来像http://example.com/abc.php?usera=abc&datab=xyz&timestamp=123456789其中时间戳是当前时间(在 Z4913A9178621 和这个91DB179 应用程序5FBCBZDF1 中添加时间戳)

public static String makeCheck(String url)
{
    URL u=new URL(url);
    MessageDigest md = MessageDigest.getInstance("MD5");
    u.getQuery();
    md.update(u.getQuery().getBytes());
    BigInteger bn = new BigInteger(1,md.digest("A_SECRET_WORD".getBytes()));
    return bn.toString(16);
}

当您需要添加 header 时,请使用以下内容:

request.addHeader("X-CHECKSUM", makeCheck(url) );

然后在您的服务器上,您可以使用:

if (md5($_SERVER['QUERY_STRING']."A_SECRET_WORD")!=$_SERVER['X-CHECKSUM']) {
    // Wrong checksum
}

$timediff=60;

if ( $_GET['timestamp']>(time()+$timediff) || $_GET['timestamp']<(time()-$timediff) ) {
    // Bad timestamp
}

请记住在时间戳上稍稍松懈,因为您的服务器时钟和手机时钟可能会有点不同步。

执行此操作的典型方法是在 HTTP 请求中使用用户代理 header。 如果请求来自标准浏览器,它将唯一标识硬件和软件。 例如,运行 Froyo 的 Nexus One 将具有以下用户代理:

Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

但是,如果您使用 HttpClient 从您的应用程序发出请求,则可以自定义 HttpClient 使用的用户代理 header,如以下答案所示: Android Z293C9EA246FF9985DC6F62A650F789 用户代理

在服务器端,您可以在用户代理 header 上使用正则表达式匹配来确定请求是否来自您的 Android 应用程序,并发送适当的响应。

当您在 android 中创建 HttpClient 时,您可以设置以下内容

 client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "MY Android device identifier");

这为发送到您的服务器的每个 http 请求设置了 USER_AGENT。 在您的服务器上,您可以检索 USER_AGENT 以确定请求来自您的 android 设备

如果实际请求相同(例如,您无法添加 POST 或 GET 变量来主动识别您的请求),则您必须依赖其他东西,例如用户代理。

虽然您可以根据自己的意愿在应用程序中设置它们(另请参阅@mark_bakker nd @mark_allison 的答案),但您应该知道有一些方法可以解决这个问题,所以不要将它用于您真正不使用的东西'不想让其他用户看到。

  • android 用户理论上可以在离开您的应用程序的请求和离开他/她的网络的请求之间更改user_agent字符串。 所以不要将它用于“Android 用户没有付费,所以不应该看到这个/那个信息”的应用程序
  • 反过来说,非安卓用户也可以明显地改变他们的用户代理,所以如果你的内容只有你的付费安卓用户应该看到,他们可能会伪造字符串。

最后,如果可以的话,最好只是改变你的请求:你想要一个不同的回复,你应该做一个不同的请求是我的意见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM