在我的代码中,防止 sql 注入的最佳实践是什么?[关闭]

What will be the best practices in my code to prevent sql injection? [closed]

提问人:touhidalam69 提问时间:9/1/2020 最后编辑:touhidalam69 更新时间:9/1/2020 访问量:173

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

3年前关闭。

防止 sql 注入的最佳实践是什么?我的客户要求我防止 sql 注入。我使用此结构进行数据插入或更新

public bool Add(GreenItem aGreenItem, Employee emp)
        {
            aGreenItem.GreenItemCode = new CommonBLL().GetMaxId("[GreenItemCode]", "[Processing].[GreenItem]", "GTM");
            using (SqlConnection objConnection = Connection.GetConnection())
            {
                SqlTransaction transaction = objConnection.BeginTransaction("SampleTransaction");
                try
                {
                    string query = aGreenItem.GreenItemId == 0 ? "GreenItem_Create" : "GreenItem_Update";
                    SqlCommand sqCmd = new SqlCommand(query, objConnection, transaction);
                    sqCmd.CommandType = CommandType.StoredProcedure;
                    if (aGreenItem.GreenItemId > 0)
                    {
                        sqCmd.Parameters.AddWithValue("@GreenItemId", aGreenItem.GreenItemId);
                    }
                    else
                    {
                        sqCmd.Parameters.AddWithValue("@GreenItemCode", aGreenItem.GreenItemCode);
                    }

                    sqCmd.Parameters.AddWithValue("@GreenItemName", aGreenItem.GreenItemName);
                    sqCmd.Parameters.AddWithValue("@MeasurementUnitId", aGreenItem.MeasurementUnitId);                    
                    sqCmd.Parameters.AddWithValue("@Description", aGreenItem.Description);
                    sqCmd.Parameters.AddWithValue("@IsActive", aGreenItem.IsActive);
                    sqCmd.Parameters.AddWithValue("@GLTId", emp.GLTId);
                    sqCmd.Parameters.AddWithValue("@CreatorId", emp.EmployeeId);
                    sqCmd.ExecuteNonQuery();
                    transaction.Commit();
                    return true;
                }
                catch
                {
                    transaction.Rollback();
                    return false;
                }
            }
        }

我使用这个函数来获取从上面的函数调用的最大 ID

public string GetMaxId(string coloumName, string tableName, string prefix)
        {
            string maxId = ""; string selectQuery = "SELECT '" + prefix + "'+RIGHT('0000000000'+ CONVERT(VARCHAR,ISNULL(MAX(RIGHT(" + coloumName + ",10)), 0)+1,10),10) maxID FROM " + tableName + " ";
            using (SqlConnection objConnection = Connection.GetConnection())
            {
                SqlCommand sqCmd = new SqlCommand(selectQuery, objConnection); sqCmd.CommandType = CommandType.Text;
                using (IDataReader dataReader = sqCmd.ExecuteReader())
                {
                    while (dataReader.Read())
                    {
                        maxId = dataReader["maxID"].ToString();
                    }
                }
                objConnection.Close();
            }

            return maxId;
        }

为了获得最佳输出,需要添加什么?

C# asp.net SQL-Server SQL 注入

评论

2赞 Milney 9/1/2020
您已经通过使用 SqlParameters 而不是直接操作字符串来阻止 SQL 注入。干得好。我们看不到 CommonBLL() 是什么。不过,GetMaxId() 确实如此,也许也会发布它
0赞 Thom A 9/1/2020
使用参数化查询和安全引用动态对象(如果有)是最佳方法。另外,我们能停止使用AddWithValue()吗? & AddWithValue 是邪恶的
0赞 touhidalam69 9/1/2020
在 POST 上添加了 GetMaxId 函数。 @Milney
1赞 Rup 9/1/2020
好的 - GetMaxId 中肯定有 SQL 注入的余地,因为您正在使用作为参数传递的字符串来组装 SQL 语句,而没有任何转义,最好像在 Add() 中那样使用参数。但是,如果您只打算使用应用中的硬编码字符串调用 GetMaxId(),而从不使用用户可以影响的字符串,则可能会侥幸逃脱。
0赞 touhidalam69 9/1/2020
我总是在另一个函数上调用这个函数,并传递固定参数@Rup

答:

3赞 Marc Gravell 9/1/2020 #1

使用 SQL Server,避免 SQL 注入归结为一件简单的事情

  • 对所有输入使用参数,而不是串联

你已经在我们可以看到的代码中这样做了,所以:到目前为止做得很好。

人们经常误以为“使用存储过程”来避免SQL注入,但“存储过程”和“SQL注入”其实是完全正交的——你可以避免没有存储过程的SQL注入,也可以在存储过程中引起SQL注入。我们看不到内部做什么/做什么 - 如果它们很简单/操作,它们可能没问题。只要他们不在内部做,你应该没事。如果确实需要在 T-SQL 中生成 T-SQL,请确保使用以正确参数化该动态 SQL。GreenItem_CreateGreenItem_UpdateINSERTUPDATEEXEC (@somethingYouConcatenated)sp_ExecuteSQL