我们已经建立了一个Android应用程序,从Android到我的PHP服务器POST HTTP请求。作为响应,webservice将JSON对象发送到Android应用程序以显示结果。
像其中一项服务就像是http://mydomain.com/test/weather.php?lat=13.4332&long=80.454
由于我不是android的专家,所以想要从PHP端处理webservice的安全性。
如何保护我的网络服务电话,以便只有我的应用才能使用我的网络服务。我不想要有人解密apk并获取webservice URL并在自定义输出数据后使用它。
我怎样才能做到这一点?请给我任何好的例子。
答案 0 :(得分:6)
如果你有能力,你应该在你的应用程序中实现HTTPS的使用,这可以解决许多安全问题。 创建自签名服务器SSL证书,并在Web服务器上使用Android SDK中的keytool进行部署。然后创建一个自签名客户端,并将其作为资源在应用程序中包含的自定义密钥库中部署到您的应用程序中(keytool也会生成它)。将服务器配置为要求客户端SSL身份验证,并仅接受您生成的客户端证书。 oReilly : Application Security for the Android Platform 要么 如果它只是您的客户端和服务器,您可以(而且应该)使用SSL而无需购买任何东西。您可以控制服务器和客户端,因此每个应该只信任一个证书,一个属于另一个证书,并且您不需要CA.PHP可以通过POST或GET从您的站点甚至互联网浏览器接收数据。用于实现此目的的方法之一是卷曲。 您必须在PHP中验证POST或GET收到的信息,这种语言有很强的能力来解决这些“问题”;看一下PHP官方文档的这一部分。
假设您正在构建登录系统:此外,您可以在登录页面中添加一个隐藏元素,其中包含秘密唯一代码,该代码只能发生一次,将此密码保存在会话中,因此,登录脚本会查找会话中的此代码与发布到脚本的代码相比,应该继续。
而且,如果您想获取访问者的IP地址:
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
您希望在此处查找:Encrypt data within mobile app and send to web service和Web services: how prevent illegal accesses
答案 1 :(得分:1)
确保在POST请求中请求额外字段以检查发件人的ID。在此字段中,您可以使用哈希序列,例如由md5算法生成的哈希序列。
因此,在您的Android应用中,您将使用标识符和常规字符串生成哈希字符串,如下所示:
$identifier='Here comes an understandable unique Id for your App user';
$common_sequence='Here comes random sequence, the same to be used server-side';
$hash_sequence=crypt($identifier . $common_sequence);
在你的POST中你有2个字段:
在您的服务器中,您可以重新生成hash_sequence,因为您已经拥有common_sequence,还有userId。检查它们是否匹配。
然而,这个解决方案有一些弱点,特别是可以多次使用hash_sequence这一事实。您可以考虑在生成序列中插入时间因子,例如yyyymmddHHmm,这样序列每分钟都会改变。
Crypt()是一个在PHP中生成hash_sequence的函数。但是,您需要一种在App中生成类似序列的方法。在这种情况下,一个简单的MD5哈希就足够了,Android Dev语言必须有一个MD5生成器原生。
祝福,