注入安全SQL更新查询不做任何更改

本文关键字:任何更 查询 安全 SQL 更新 注入 | 更新日期: 2023-09-27 17:53:34

我目前正在制作一个由Access数据库支持的ASP网站。在网站上,我想让玩家购买一些物品。他们有两种货币——宝石和草药。

当玩家购买道具时,我想要执行三个独立的操作-

  • 通过更改ItemPlayerConnection表中的相关布尔值,将商品从他们的商店传递到他们的库存
  • 从他们的货币中减少"宝石"的整数根据他们的购买
  • 从他们的货币中减少"药草"的整数,也根据他们购买的东西。

因此,我试图构建3个不同的查询-第一个应该看起来像这样:

UPDATE ItemPlayerConnection
SET Inventory=TRUE
WHERE 
Player=PlayerNameHere 
AND Item=ItemIDHere

为了将商品从商店移到库存中。第二个和第三个是相似的,唯一的区别是宝石和草药-他们应该看起来像这样:

UPDATE Player
SET CurrencyNameHere=(CurrencyNameHere-ItemPriceHere)
WHERE 
Owner=PlayerNameHere

所以我尝试了以下代码:

static public void Purchase(string player, int itemID, int herbPrice, int gemPrice)
    {
        OleDbCommand command1 = GenerateConnection(
            "UPDATE ItemPlayerConnection SET Inventory=TRUE WHERE Player=@player AND Item=@itemID");
        command1.Parameters.AddWithValue("@player", player);
        command1.Parameters.AddWithValue("@itemID", itemID);
        OleDbCommand command2 = GenerateConnection(
            "UPDATE Player SET Herbs=(Herbs-@herbPrice) WHERE Owner=@player");
        command2.Parameters.AddWithValue("@herbPrice", herbPrice);
        command2.Parameters.AddWithValue("@player", player);
        OleDbCommand command3 = GenerateConnection(
            "UPDATE Player SET Gems=(Gems-@gemPrice) WHERE Owner=@player");
        command3.Parameters.AddWithValue("@gemPrice", gemPrice);
        command3.Parameters.AddWithValue("@player", player);
        command3.ExecuteNonQuery();
        command2.ExecuteNonQuery();
        command1.ExecuteNonQuery();
    }

和断点,我看到查询-他们看起来很好,然而,虽然草药和宝石被改变,项目没有从商店传递到库存。这些不会引发语法错误-

我的错误是什么?

注入安全SQL更新查询不做任何更改

你的代码看起来很好,你可能有一个业务错误,但我想帮助其他的东西:

  • AddWithValue只需要参数名和值,不需要类型;
  • 你应该正确地命名参数,因为这将使维护你的代码更容易你应该考虑将所有这些命令封装在一个数据库事务中,使它们作为一个原子单元工作;这不在
  • 下面的代码中

修改后的代码为:

static public void Purchase(string player, int itemID, int herbPrice, int gemPrice)
{
    OleDbCommand command1 = GenerateConnection(
        "UPDATE ItemPlayerConnection SET Inventory=TRUE WHERE Player=@player AND Item=@itemID");
    command1.Parameters.AddWithValue("@player", player);
    command1.Parameters.AddWithValue("@itemID", itemID);
    OleDbCommand command2 = GenerateConnection(
        "UPDATE Player SET Herbs=(Herbs-@herbPrice) WHERE Owner=@player");
    command2.Parameters.AddWithValue("@herbPrice", herbPrice);
    command2.Parameters.AddWithValue("@player", player);
    OleDbCommand command3 = GenerateConnection(
        "UPDATE Player SET Gems=(Gems-@gemPrice) WHERE Owner=@player");
    command3.Parameters.AddWithValue("@gemPrice", gemPrice);
    command3.Parameters.AddWithValue("@player", player);
    command3.ExecuteNonQuery();
    command2.ExecuteNonQuery();
    command1.ExecuteNonQuery();
}

显然你们没有机会,是我的错。由单击按钮触发的另一个函数发送了ItemID—显然,我使用了错误的方法来获取它,并且我发送了错误的值—因此,执行了查询,语法是正确的,但是由于没有具有我发送的id的项目—没有发生任何事情。我通过设置断点和查看参数值来计算。现在让我们喝一杯吧,你和我,为许多愚蠢的错误干杯。:)

 SqlConnection con = new SqlConnection("");
        SqlDataAdapter da = new SqlDataAdapter();
        SqlConnection cmd = new SqlConnection();
        DataTable dt = new DataTable();
            da.SelectCommand = con.CreateCommand();
            da.SelectCommand.CommandText="UPDATE ItemPlayerConnection SET Inventory=TRUE WHERE Player="+player+" AND Item="+itemID);
            da.SelectCommand.CommandType = CommandType.Text;
            da.Fill(dt);