提问人:touhidalam69 提问时间:9/1/2020 最后编辑:touhidalam69 更新时间:9/1/2020 访问量:173
在我的代码中,防止 sql 注入的最佳实践是什么?[关闭]
What will be the best practices in my code to prevent sql injection? [closed]
问:
防止 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;
}
为了获得最佳输出,需要添加什么?
答:
3赞
Marc Gravell
9/1/2020
#1
使用 SQL Server,避免 SQL 注入归结为一件简单的事情
- 对所有输入使用参数,而不是串联
你已经在我们可以看到的代码中这样做了,所以:到目前为止做得很好。
人们经常误以为“使用存储过程”来避免SQL注入,但“存储过程”和“SQL注入”其实是完全正交的——你可以避免没有存储过程的SQL注入,也可以在存储过程中引起SQL注入。我们看不到内部做什么/做什么 - 如果它们很简单/操作,它们可能没问题。只要他们不在内部做,你应该没事。如果确实需要在 T-SQL 中生成 T-SQL,请确保使用以正确参数化该动态 SQL。GreenItem_Create
GreenItem_Update
INSERT
UPDATE
EXEC (@somethingYouConcatenated)
sp_ExecuteSQL
评论