【发布时间】:2014-06-04 10:49:46
【问题描述】:
我读过这样连接 SQL 字符串是个坏主意:
cmd.CommandText = "Insert INTO workers Values (" + User.Identity.Name + "," + WorkerName.Text + "," + GetUniqueWorkerKey() + ");";
所以推荐的方法是:
cmd.CommandText = "Insert INTO workers Values (@Username, @WorkerName, @WorkerKey)";
cmd.Parameters.AddWithValue("@Username", User.Identity.Name);
cmd.Paramters.AddWithValue("@WorkerName", TheWorkerNameYouPassedToThisMethod);
自从我读到它之后,我就一直在避免连接 SQL 字符串,但我从来没有真正知道不这样做的原因。 AddWithValue() 方法最终不会在幕后进行相同的字符串连接吗?
也许该方法会去除特殊字符并将字符转换为 html 实体以防止 sql 注入,但我可以在连接我的 SQL 之前完成所有这些操作,我也得到相同的效果,不是吗?还是有其他原因不练习 SQL 的字符串连接?
【问题讨论】:
-
@SriramSakthivel 参数化和连接有什么区别?参数化的不是在幕后进行字符串连接吗?如果是这样,同样的 sql 注入仍然是可能的。
-
@Carven 不,它将替换占位符中的值。它不会串联。如果您的参数值包含任何“sql 关键字”,它将不会被执行,而是会抛出异常。试试看..
-
@Carven: NO 参数化查询是 NOT 串联的“幕后” !” - 这就是重点。查询作为参数化查询与参数及其值一起发送到服务器 - 它在发送之前在客户端NOT连接在一起到服务器!然后只有服务器将获取这些参数并替换它们的值 - 并进行如下检查:这必须是一个有效的整数并拒绝任何试图偷偷不属于那里的东西
标签: c# sql .net concatenation string-concatenation