【发布时间】:2014-12-09 05:54:05
【问题描述】:
我遇到了一个问题。我正在创建一个基于网络的游戏。它更像是基于实时网络的应用程序。我的玩家可以建造建筑物。每个建筑物都有唯一的哈希 ID。具有所有参数的已构建建筑物存储在 SQL 中。我想做的就是制作自动收集资源(黄金)的引擎。我不想使用 cron。我想做到这一点,当我按下“引擎启动”时,它会开始收集金币:
if( $sql['engine'] == 1 ){
//do the job..
}
我试过这个方法,但没有运气(collect.php):
if( $sql['engine'] == 1 ){
mysql_query("UPDATE `info` SET `gold` = `gold` + 10 WHERE `building`='{$building}'");
}
还有index.php:
function enginestat() {
$("#EngineStatus").load("../job/collect.php?building=<?php echo $building; ?>", function () {
setTimeout( function () {
enginestat();
}, 1000);
});
}
$( function () {
enginestat();
});
我相信我做错了什么,但有人能告诉我我做错了什么吗?我需要一个答案,我需要详细的信息。谢谢。
【问题讨论】:
-
警告:这是非常不安全的,因为这些参数不是properly escaped。您应该绝不将
$_POST数据直接放入查询中:它会创建一个巨大的SQL injection bug。mysql_query是一个过时的接口,不应使用,它已从 PHP 中删除。像PDO is not hard to learn 这样的现代替代品。像 PHP The Right Way 这样的指南解释了最佳实践。 -
由于您正在编写一款竞争激烈的游戏,因此您将成为黑客攻击的目标。一定要按部就班。一个小小的错误就足以破解整个数据库。如果您刚刚开始使用您的应用程序,您可能需要评估各种development frameworks,例如Laravel,这可以使您的设计更容易实现。
-
从技术上讲,您的
<?php echo $building; ?>"",在引号之外。其实,一句话太多了。("../job/collect.php?building=<?php echo $building; ?>",- 我的错. -
@tadman 潜在的 sql 注入和您在此处指出的“巨大的 SQL 注入错误”有什么区别?它会结束宇宙的生命吗?有用的提示不会因为夸大而变得更好!
-
除了 SQL 注入之外,我认为让客户端脚本决定玩家获得金币的频率几乎意味着他们可以随心所欲地获得金币。