我的代码中防止 sql 注入的最佳做法是什么?

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

防止 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;
                }
            }
        }

我使用这个函数来获取从上面的函数调用的 Max 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;
        }

需要添加什么以获得最佳输出?

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

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

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

人们经常错误地说“使用存储过程”来避免SQL注入,但“存储过程”和“SQL注入”实际上是完全正交的——你可以避免SQL没有存储过程的注入,你可以cause SQL注入inside存储过程。我们 看不到 GreenItem_Create / GreenItem_Update 在内部做什么 - 如果它们很简单 可能 没问题 INSERT / UPDATE 操作。只要他们不在内部执行 EXEC (@somethingYouConcatenated),您应该没问题。如果您需要在T-SQL中构建T-SQL,请确保使用sp_ExecuteSQL正确参数化动态SQL。