用户通过简单如果检查

时间:2014-03-27 17:52:45

标签: php mysql sql

我有一个浏览器游戏,您可以通过点击提交按钮升级attackdefencespiespatrol。每次升级都需要X金和X食品。 这是游戏的地址(用希伯来语): http://www.mafia.co.il

在过去的几天里,一些用户找到了一种方法来升级它而没有足够的黄金/食物。结果是他们在游戏资源中有负数。当然我以为我阻止了这个选项。

另外,由于某种原因,他们能够将其升级10次以上 - 当您阅读代码时,您会看到我至少试图阻止该选项。

请问有人知道问题出在哪里吗?

这是升级代码(我将希伯来语部分翻译成英语,我还添加了注释):

foreach循环的原因是获取$_POST的名称。

elseif (isset($_POST['attack']) || isset($_POST['defence']) || isset($_POST['spies']) || isset($_POST['patrols']))  {
    // Get user details
    $ud = details($user_id);
    foreach($_POST as $name => $val)    {
    // Number came with ','. So here i'm removing it.
        $pr['gold'] = str_replace(',','',get_upg_price($ud['cvl'][$name]));
        $pr['food'] = str_replace(',','',get_upg_price($ud['cvl'][$name]));
         // Check if the user has enough food and gold.
        if (check_rsc($pr,$ud)) {
        // Check if user has maximum upgrade possible.
            if ($ud['cvl'][$name] < 10) {
                mysql_query("UPDATE `civ_level` SET ".$name."=".$name."+1 WHERE ID='".$user_id."'");
                mysql_query("UPDATE `resources` SET gold=gold-'".$pr['gold']."', food=food-'".$pr['food']."' WHERE ID='".$user_id."'");
                update_power($user_id);
            }   else    {
                $error = "<tr><td colspan='8' style='color:black; background: #CC3333; border:1px solid white;'>you are at maximum possible upgrade.</td></tr>";
            }
        }   else    {
            $error = "<tr><td colspan='8' style='color:black; background: #CC3333; border:1px solid white;'>You dont have enough resources.</td></tr>";
        }
    }
}

功能详情:

function details($id)   {
    $select1 = mysql_query("SELECT * FROM `users` WHERE ID='".$id."'");
    $sel = mysql_fetch_array($select1);
    $array['usr'] =  $sel;
    $select2 = mysql_query("SELECT * FROM `user_d` WHERE ID='".$id."'");
    $sel2 = mysql_fetch_array($select2);
    $array['usd'] =  $sel2;
    $select3 = mysql_query("SELECT * FROM `resources` WHERE ID='".$id."'");
    $sel3 = mysql_fetch_assoc($select3);
    $array['rsc'] =  $sel3;
    $select4 = mysql_query("SELECT * FROM `train_price`");
    $sel4 = mysql_fetch_assoc($select4);
    $array['trp'] =  $sel4;
    $select5 = mysql_query("SELECT * FROM `civ_level` WHERE ID='".$id."'");
    $sel5 = mysql_fetch_array($select5);
    $array['cvl'] =  $sel5;
    if (empty($array['usd']))   {
        return false;
    }   else    {
        return $array;
    }
}

功能get_upg_price:

function get_upg_price($level)  {
    $a = 0;
    $price = 100;
    while ($a<$level)   {
        $price = $price*3;
        $a++;
    }
    return number_format($price);
}

功能check_rsc:

function check_rsc($array,$ud)  {
    foreach ($array as $name => $val)   {
        if ($ud['rsc'][$name] < $val)   {
            return false;
        }
    }
    return true;
}

输入示例:

<form method='post'><input type='submit' name='attack' value='train' />

谢谢!

1 个答案:

答案 0 :(得分:0)

始终但始终使用addslashes($userInput)addslashes函数可以保护您免受sql注入,并防止用户欺骗游戏。

永远不要让变量直接进入数据库 那是你的错误