我的Android应用程序有一个与之关联的App Widget,它在Android设备上每10分钟更新一次.这些更新将HTTP数据请求发送到服务器并解析服务器响应并根据需要更新应用程序.
截至目前,如果您从笔记本电脑或PC上的浏览器ping该URL,服务器将响应并更新服务器上数据库中所需的任何内容.
我想要做的是当在服务器上收到HTTP请求时,我想确定请求是来自Android设备的Android应用程序,然后使用数据进行响应.我想改变服务器上PHP中的代码,如果HTTP请求来自浏览器或除了我的Android应用程序以外的任何其他内容,它们将显示或重定向到某个页面.
来自Apps的典型HTTP请求类似于http://example.com/abc.php?usera=abc&datab=xyz
如果它来自除Android应用程序之外的任何其他地方,我不想以相同的方式回复此URL.这可能吗?什么是实现这一目标的好方法..
谢谢你的帮助.
最佳答案
您可以为请求添加签名,然后在服务器端进行检查.
原文链接:https://www.f2er.com/android/431061.html只需获取查询并在末尾添加一个密码,然后创建一个MD5,您可以将其作为标题发送(或用作用户代理).并在服务器上执行相同操作并检查校验和是否相同.
为了使它更安全,您可以设置时间戳,以便请求仅在短时间内有效.
使您的查询看起来像http://example.com/abc.php?usera=abc&datab=xyz×tamp=123456789,其中timestamp是当前时间(在unix时间戳中)并在您的应用中添加:
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);
}
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
}
记住时间戳有点松弛,因为你的服务器时钟和电话时钟可能有点不同步.