繁体   English   中英

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

[英]is it safe using dynamic SQL with parameters? If not, what security issues might it be exposed to?

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

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();
}

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

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

它可以安全地防止SQL注入,因为它是参数化的。 其他安全问题,例如确保@userid不被欺骗,是应该在应用程序的其他层中处理的单独的安全问题。

那仍然是一个静态查询字符串。 它不是真正的“动态”sql,直到您还可以动态构建部分字符串 - 如下所示:

var sql = "SELECT columns FROM Table WHERE 1=1";
if (!string.IsNullOrEmpty(txtName.Text)) sql += " AND Name LIKE '%' + @Name + '%'";
if (!string.IsNullOrEmpty(txtDesc.Text)) sql += " AND CONTAINS(DESCRIPTION, @description)";

但即便如此,只要您继续使用源自用户输入的查询的每个部分的参数,这在sql注入意义上仍然是“安全的”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM