如何解决在我的代码中防止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;
}
}
}
我使用此函数来获取上面的函数调用的最大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 Server,避免SQL注入归结为一件事
- 对所有输入使用参数而不是串联
您已经在我们可以看到的代码中做到了,所以:到目前为止,做得很好。
人们经常错误地说“使用存储过程”以避免SQL注入,但“存储过程”和“ SQL注入”实际上是完全正交的-您可以避免没有存储过程的SQL注入,并且可以 SQL注入内部存储过程。我们看不见 GreenItem_Create
/ GreenItem_Update
在内部做什么-如果它们很简单INSERT
/ { {1}}个操作。只要他们在内部不做UPDATE
,就可以了。如果您需要在T-SQL中构建T-SQL,请确保使用EXEC (@somethingYouConcatenated)
正确地为该动态SQL设置参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。