Quelles seront les meilleures pratiques pour empêcher l'injection SQL? Mon client m'a demandé d'empêcher l'injection SQL. J'ai utilisé cette structure pour insérer ou mettre à jour des données
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;
}
}
}
J'ai utilisé cette fonction pour obtenir l'ID Max qui est appelé à partir de la fonction ci-dessus
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;
}
À quoi faut-il ajouter pour obtenir le meilleur résultat?
Avec SQL Server, éviter l'injection SQL se résume à une chose simple
Vous faites déjà cela dans le code que nous pouvons voir, donc: excellent travail jusqu'à présent.
Les gens disent souvent à tort «utiliser des procédures stockées» pour éviter l'injection SQL, mais les «procédures stockées» et «l'injection SQL» sont en fait entièrement orthogonales - vous pouvez éviter l'injection SQL sans procédures stockées, et vous pouvez provoquer une injection SQL dans des procédures stockées. Nous ne pouvons pas voir ce que GreenItem_Create
/ GreenItem_Update
faire en interne - ils sont probablement bien s'ils sont simples INSERT
/ UPDATE
operations. Tant qu'ils ne le font pas en EXEC (@somethingYouConcatenated)
interne, ça devrait aller. Si vous ne avez besoin de construire T-SQL dans T-SQL, assurez - vous d'utiliser sp_ExecuteSQL
correctement que SQL paramétrez dynamique.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras