篡改数据
有一个叫做篡改数据的可怕的东西。它接收 FLASH 到 PHP 的所有 POST 数据,并为用户提供更改值的能力。
想象一下,在Flash游戏中(用 ActionScript 3 编写)是得分点和时间。匹配完成后,得分和时间变量将发送到 PHP 并插入数据库。
但是用户可以在匹配完成后使用篡改数据轻松更改值。因此,更改的值将插入到数据库中。
我的想法似乎没有成功
我想在每次更改时更新数据库中的数据?我的意思是如果玩家获得+10分,我需要立即将其写入数据库。但是时间怎么样?我需要每隔几毫秒在数据库中更新我的表吗?那是保护解决方案吗?如果用户可以更改 POST 数据,他可以在上次游戏完成时每次都更改它。
那么如何避免第三方软件如篡改数据?
令牌。我已阅读有关 Tokens 的文章,有人谈论如何创建随机字符串作为令牌并将其与数据库进行比较,但它没有详细说明,我也不知道如何实现它。这是个好主意吗?如果是的话,也许有人如何实现它?
答案 0 :(得分:0)
根据我的说法,更好的方式是以加密格式发送参数和值,例如score=12
发送类似c2NvcmU9MTI=
base64
function encrypt($str)
{
$s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(SALTKEY), serialize($str), MCRYPT_MODE_CBC, md5(md5(SALTKEY)))), '+/=', '-_,');
return $s;
}
function decrypt($str)
{
$s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(SALTKEY), base64_decode(strtr($str, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5(SALTKEY))), "\0"));
return $s;
}
答案 1 :(得分:0)
通常,无法保护Flash中生成的内容并将其发送到服务器。
即使您使用密钥加密数据,密钥和加密算法都包含在swf文件中,并且可以反编译。它比简单伪造数据更难,因此它是一种可用的解决方案,但它并不总是有用。
要获得完全的安全性,您需要在服务器上运行所有游戏模拟。例如,如果玩家跳过并抓住了一枚硬币,Flash就不会向服务器发送“得分+10”。相反,它发送玩家坐标和速度,服务器进行检查:硬币在哪里,玩家在哪里,玩家的速度是什么,玩家是否可以获得硬币。
如果无法在服务器上运行完整模拟,则可以通过每隔一段时间向服务器发送数据来进行部分检查。
首先,永远不要发送“最终”分数或任何其他分数。这很容易伪造。相反,每当玩家做出改变其分数的事情时发送一个事件。
例如,每次玩家捕获硬币时,都会将此事件发送到服务器。您可能无法跟踪玩家坐标或硬币坐标,但您知道该等级仅包含10个硬币。因此,无论如何,玩家无法捕获超过10个硬币。此外,玩家无法快速捕获硬币,因为您知道硬币之间的最小距离和最大玩家速度。
每次收到数据时都不应将数据写入数据库。相反,你需要将每个玩家的数据保存在内存中并在那里进行更改。您可以使用noSQL数据库,例如Redis。
答案 2 :(得分:0)
首先,作弊者总是作弊。真的没有简单的解决方案(或困难的解决方案)来完全防止它。有很多关于开发人员劝阻作弊的文章很多,但它几乎在所有游戏中都很流行。
尽管如此,这里有一些建议可以阻止作弊:
加密您的数据。这不是无与伦比的,但会阻止许多懒惰的黑客,因为他们不能只是篡改普通的http流量,他们首先必须找到你的加密密钥。查看as3corelib for AS3 encryption。
模糊您的SWF。 There are a few tools out there to do this for you.同样,这不是无与伦比的,但这是让骗子更难找到加密密钥的简单方法。
将所有计时逻辑移至服务器。而不是客户端告诉服务器时间,而是告诉服务器有关“GAME_STARTED”和“SCORED_POINTS”等操作的信息。然后,服务器跟踪用户的时间并计算最终得分。这里重要的是客户端不告诉服务器任何与时间相关的内容,而只是采取的操作和服务器使用自己的时间。
如果您可以建立关于最大可能性能的任何规则(例如每秒10点),您可以在服务器上检测某些类型的作弊行为。例如,如果您收到SCORED_POINTS = 100但最大值为10,那么您就是骗子。或者,如果你收到SCORED_POINTS = 10,那么SCORE_POINTS = 10几毫秒之后,再过几毫秒,你可能会有一个骗子。小心这一点,并知道这是一场来回的战斗。欺骗者总会想出巧妙的方法来绕过你的检测逻辑,你不希望你的检测逻辑如此严格,以至于你不小心拒绝一个诚实的玩家(也许是一个非常熟练的玩家,他的表现超出了你最初的想法)可能)。
当你发现一个骗子时,"honey pot"他们。不要告诉他们他们在作弊,因为这只会鼓励他们找到避免被发现的方法。