好吧,我正在为游戏战斗武器设计一个反作弊行为。 我想要做的是用数据库'ping'程序,这样人们就不能简单地创建一个程序,使它看起来像是在使用反作弊。
有没有办法'加密'或阻止其他人轻松模拟连接? 我对PHP不太满意,到目前为止它是如何添加的:
public function Update()
{
$ign = $_GET['ign'];
$timestamp = $_GET['uid'];
$time = time();
if(($time - 10 < $timestamp) && ($time + 10 > $timestamp))
{
$this->connection();
$data = mysql_query("SELECT * FROM users WHERE ign = '{$ign}'");
if(mysql_num_rows($data) > 0)
{
mysql_query("UPDATE users SET lastonline = '{$time}' WHERE ign = '{$ign}'");
}
else
{
mysql_query("INSERT INTO users (id, ign, lastonline) VALUES ( NULL, '{$ign}', '{$time}' ) ");
}
echo "Connected to database";
}
else
{
echo "Problem connecting";
}
}
我需要某种方式来保护它/使其难以快速破解。 一旦破解我就可以轻松改变,希望这提供了足够的信息!
答案 0 :(得分:1)
首先,您必须清理SQL输入,这是非常必要的。我建议使用PDO准备(ext/mysql
为going on a journey far, far away)。
$db = new PDO(<connection details>);
$prepare = $db->prepare("SELECT * FROM users WHERE ign = :ign");
// Tip: make sure you actually check the prepare worked before trying to execute.
$prepare->execute(array(":ign" => $ign));
等等。阅读reference manual。
但是如果你使用的是mysql_ *并且拒绝改变(虽然如果你在发布时将PHP更新为5.5,那么你会抛出E_DEPRECATED
),使用mysql_real_escape_string
并删除引号在查询中。
有几种方法可以做到这一点,但最安全的(也是唯一应该选择的选项)可能是加密强大的东西,例如One Time Pad或OAuth。
生成凭据,并使游戏发送一个使用唯一生成的哈希签名的令牌,可能来自产品代码。这应该对每个安装都是唯一的,并且应该生成能够由脚本验证的哈希。
这是游戏公司不断研究的问题,但它往往是徒劳的;任何觉得值得花时间的人都可以对你的游戏进行逆向设计。反作弊也是如此。
<小时/> 然而,签署请求并包括:
另外,对于对游戏的热爱,不要做一个Punkbuster风格的反作弊(又名不要以僵尸网络式的方式禁止请求;它可能被滥用< / em> source 子>)
最后,我可能会建议聘请专业的安全研究人员来审核所有内容。