2014-03-27 54 views
1

我有一個瀏覽器遊戲,您可以通過單擊提交按鈕來升級您的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' />

謝謝!

+0

我們沒有任何想法,你的數據庫是什麼樣子,你爲什麼不中的一些查詢結果的補充上,通常會運行這些錯誤的情況。 –

+0

你檢查過SQL注入嗎? \ e:爲什麼您輸出'number_format'ted價格並在之後刪除逗號? – Sbls

+0

@RedAlert我沒有添加它,因爲查詢永遠不會運行。有一個'IF'條件來檢查用戶是否有足夠的資源。不知何故,有些用戶能夠通過它,並獲得他們的資源減去。 @Sbls我沒有檢查,但我不認爲這是這種情況,因爲所有被欺騙的用戶只能將他們的「攻擊,防禦,間諜和巡邏」升級到非常高的水平,得到。如果是SQL注入,我會在其他表上使用它。另外,更新查詢沒有任何用戶輸入... – OfirH

回答

0

始終,但始終使用addslashes($userInput), addslashes函數將讓你從sql注入安全,並防止您的用戶欺騙遊戲。

不要讓你的變量直接進入數據庫 這是你的錯誤

相關問題