我的代码中防止 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。
防止 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。