停止设置的负面结果

时间:2013-07-31 19:52:15

标签: php mysql

我有一个脚本,用户可以在游戏中互相发送资金。

问题是,用户输入“将-99999钱捐给用户名”,然后我的脚本从他们输入的用户那里获取99999并将其提供给他们。

所以这是我的剧本:

if(isset($_POST['usernameofmoney'])) 
{
    $resson= mysql_real_escape_string($_POST['usernameofmoney']);
    $resson2 = strip_tags($resson);

    $bannedusername= mysql_real_escape_string($_POST['money']);
    $bannedusername2 = strip_tags($bannedusername);

    $sql = "SELECT * FROM `users` WHERE `username` = '" . $_SESSION['username'] . "'";
    $result = mysql_query($sql) or die(mysql_error());
    $values = mysql_fetch_array($result);

    // We do this if they do no have enough coins
    if ( $values['money'] < $bannedusername2  ) {
        echo  "You Don't Have Enough Money Sorry";
        die;
    }

    if ( $values['money'] > $bannedusername2 ) {
        // Take the coins from the 1 users
        $gfgdgdfgds = mysql_query("UPDATE users SET money = money - ".$bannedusername2."
        WHERE username = '".$_SESSION['username']."'") or die(mysql_error()); 
        // Add the coins to the new user
        $gfgdgdfgdsf = mysql_query("UPDATE users SET money = money + ".$bannedusername2."
        WHERE username = '".$resson2."'") or die(mysql_error()); 

        echo "The Money Have Been Sent.";
    }
}

我知道我应该使用PDO,今晚我将切换到PDO。

以下是我检查用户是否有钱发送。

 if ( $values['money'] < $bannedusername2  ) {
        echo  "You Don't Have Enough Money Sorry";
        die;
    }

$ values ['money']有钱,而$ bannedusername2是他们想要给他们输入的钱。所以如果钱少于他们输入的钱那么它会停止脚本但它们是输入-99999并让它们通过..

1 个答案:

答案 0 :(得分:0)

这可能不是你问题的答案,但......

...如果我理解得很好,你的逻辑就是:

  1. 通过发出SELECT请求
  2. ,检查是否有足够的资金发送
  3. 如果是这样,请通过连续两次UPDATE查询进行货币兑换。
  4. 当您单独测试应用程序时,这可能很有效。但是,请记住,在生产中,将有几个并发访问您的数据库。

    因此,如果说用户A(150美元)同时给用户C和用户D 100美元,则可能出现以下情况:

    1. 检查用户A是否超过100美元。是。
    2. 检查用户A是否超过100美元。是。
    3. 由于(1)为真,所以给用户B 100美元。
    4. 由于(2)为真,请向用户B提供100美元。
    5. Oups。


      另一种可能的失败是第一次UPDATE成功,但第二次失败(无论出于何种原因)。在这种情况下,一个用户将减少帐户。这笔钱已经消失了......

      Oups。


      为了防止这些陷阱,你必须至少确保:

      此外,我会将您的第一个SELECT请求重写为:{/ p>,而不是UPDATE + UPDATE

      UPDATE users SET money = money - amount WHERE username = "User A"
      AND money >= amount;
      

      然后我会检查UPDATE是否影响了0行1行。前者意思是“钱不够”。