我有一個瀏覽器遊戲,您可以通過單擊提交按鈕來升級您的attack
,defence
,spies
和patrol
。每次升級都需要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' />
謝謝!
我們沒有任何想法,你的數據庫是什麼樣子,你爲什麼不中的一些查詢結果的補充上,通常會運行這些錯誤的情況。 –
你檢查過SQL注入嗎? \ e:爲什麼您輸出'number_format'ted價格並在之後刪除逗號? – Sbls
@RedAlert我沒有添加它,因爲查詢永遠不會運行。有一個'IF'條件來檢查用戶是否有足夠的資源。不知何故,有些用戶能夠通過它,並獲得他們的資源減去。 @Sbls我沒有檢查,但我不認爲這是這種情況,因爲所有被欺騙的用戶只能將他們的「攻擊,防禦,間諜和巡邏」升級到非常高的水平,得到。如果是SQL注入,我會在其他表上使用它。另外,更新查詢沒有任何用戶輸入... – OfirH