使用带参数的动态SQL是否安全?如果没有,它可能会遇到哪些安全问题?

Rou*_*oon 5 c# asp.net security parameters sql-injection

例如,这是我正在使用的代码:

String commandString = "UPDATE Members SET UserName = @newName , AdminLevel = @userLevel WHERE UserID = @userid";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand(commandString, conn);
    cmd.Parameters.Add("@newName", newName);
    cmd.Parameters.Add("@userLevel", userLevel);
    cmd.Parameters.Add("@userid", userid);
    conn.Open();
    cmd.ExecuteReader();
    Reader.Close();
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*Dev 7

该代码看起来很好.参数化是一种方法,而不是在一个特殊的SQL语句中连接用户提供的值,这可以打开你的SQL注入攻击.这也可以帮助执行计划重用.

我唯一要补充的是,我更喜欢明确定义参数的数据类型和大小.例如,如果不这样做,那么作为示例,所有字符串值将作为NVARCHAR而不是VARCHAR传递到数据库.因此我喜欢明确.