我正在制作一个与我服务器上的 php 页面通信的应用程序。
使用该页面,我可以将分数设置到数据库中。
我使用 post 变量将分数存储在 db 中,一切正常,但如果我使用 Wireshark 分析我的游戏发送到页面的内容并使用不同的数据重新执行 POST 请求,则页面将该数据存储在 db 中.
我怎样才能接受仅从我的游戏中存储的数据?
游戏是一个Java小程序,服务器是用PHP写的
您需要一种方法让 php 脚本知道收到的数据是真实的。
客户端
将所有要发送的数据连接成一个字符串。将当前日期和时间(客户端)也放入字符串中。您也需要发送该信息。
然后用更多数据“加盐”字符串,例如静态字符串“ xyw#q''wz ”或更好的从发送的数据中派生的东西。
让我们称该字符串为检查字符串
最后计算校验字符串的 MD5 哈希值并将其与您的数据以及当前日期和时间一起发送。
服务器端
php 脚本接收所有数据和 MD5 哈希。
对收到的数据执行相同的操作(连接、加盐等)以重新构建check-string,与您在客户端执行的方式完全相同。
计算其 MD5 并比较两个哈希值:接收到的哈希值和刚刚计算的哈希值。
如果它们匹配,则数据是真实的并且可以添加到数据库中。否则不是或已重新发布。
-
概括
客户端:数据 -> 构建字符串 -> 从字符串生成 MD5 -> 发送数据和 MD5
服务器:数据(已接收)-> 构建字符串-> 从字符串生成 MD5
(客户端 MD5 == 服务器端 MD5)?是的数据真实:没有伪造或转发
-
这个怎么运作
对于任何一组数据,只有一个有效的 MD5 散列。如果有人想发布虚假数据,他也需要通过有效的 MD5。但是他不知道MD5是怎么建立起来的。
为了让黑客更难,我告诉你用一些随机数据“加盐”字符串。
这只是实现您想要的一种方式(我认为更容易)。
请注意,如果客户端应用程序是用 JavaScript(而不是 Java)编写的,那么这种方法将非常容易受到攻击,因为 JS 代码会暴露构建检查字符串的过程。
最后一点:这不是防弹的。聪明的黑客仍然可以猜出您是如何构建检查字符串或反编译 Java 的,并且(通过一些努力)找到检查字符串是如何构建的,以便为他的假数据生成 MD5。