2012-04-11 171 views
0

我想我必须做一些API,其中Android应用程序将参数发送到一个php文件或类似的。安全地从Android应用程序写入远程数据库

我想到一个应用程序,会有某种高分列表。我将如何确保提交的高分值实际上是通过应用程序实现的?说这个人达到9001分。现在,如果这只会导致某种类型的file.php?score = 9001调用,那么对于找到php位置并提交他们喜欢的任何内容的人来说,我并不是很安全。

在这类问题上的任何输入?谢谢。

回答

3

有没有办法使这个100%的安全,因为你无法确认其中一个请求来自的方式,但有一个方法,使之稍硬破解高分。它基本上仍然通过默默无闻的安全性,但它需要挖掘到实际的应用程序二进制文件,而不仅仅是查看网络连接。

首先,为您的应用选择一个“密码”。不要只发送分数,还要发送与分数连接的密码的密码散列(如SHA-256或其他)。在服务器端,重新计算与分数连接的密码散列,并检查它是否与提交的散列匹配。如果不是,则拒绝提交评分。 现在这比最初的方法更安全一些,因为查看应用程序的请求并不能让您伪造分数。然而,从应用程序中查找二进制代码仍然会允许攻击者恢复密码并伪造分数提交,但这非常复杂,可能足以满足您的需要。

当然,这并不排除能够重复得分(一旦正确的散列已知,您可以提交一次任意数量的分数)。如果你想防止这种情况发生,那么提交一个分数就必须这样做:从服务器请求(随机)ID号码,散列分数+ ID +密码,提交分数+散列值,然后服务器检查这个散列值是否合适。服务器需要记住ID号码,这对编程有一点帮助。 更简单的解决方案是将每个得分与玩家名称相关联,并且每个玩家只允许1个得分。然后你可以散列密码+名字+分数。

+0

太棒了。您的答案将会很方便,作为实施交易安全的参考 – kishu27 2012-04-11 23:18:26

+0

当您说“足够满足您的目的”时,这是否意味着即使是具有在线高分列表的大型应用程序(例如,愤怒的小鸟)也采用类似的方法对此?正如你所提到的那样,还有更大程度的隐晦?感谢一些好主意! – TragedyStruck 2012-04-11 23:24:47

0

下午好!

最好通过POST与服务器通信。所以你可以发送一个额外的参数,例如键,从你的应用程序到服务器,并在那里检查。

PHP的样本:

<? 
$key = trim(htmlspecialchars($_POST['KEY'])); 

if ($key == 'your_secret_string') { 
    //write data to DB 
} 
?> 
+0

当你说“钥匙”时,你的意思是什么?我很不确定有多少源代码可以被试图反编译或类似的人发现。如果我在应用程序的某个地方有一个唯一的字符串,并将其作为POST发送,那么是否有人能够拦截并获取密钥?如何安全地执行这样的事情? – TragedyStruck 2012-04-11 23:03:07

+0

这种方法本身并不安全。任何人都可以检查网络上的流量,并轻松地嗅探并提取这种性质的密钥。更安全的方法是使用标准身份验证以及https来保护流量并访问远程端点。 – 2012-04-11 23:06:37

+0

您也可以发送带有认证数据的请求(401)。 – kpotehin 2012-04-11 23:07:55

相关问题