我正在从C#中做一个插入操作,一切都很顺利,除了一个插入语句,用户写的东西,如 "室友的书 "在一个值,因为'操作符。我怎样才能让Sql忽略'里面的值?
它们被称为参数化查询。
你可能有这样的东西。
string sql = "SELECT * FROM Bookstores WHERE StoreName = '" + txtStoreName.Text + "'";
那就是... 非常糟糕! 试想一下,如果用户输入了类似于 ';DROP TABLE Bookstores; --
而不是 roomie's books
.
你需要做的是这样。
string sql = "SELECT * FROM Bookstores WHERE StoreName = @StoreName";
using (var cn = new SqlConnection("connection string here"))
using(var cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@StoreName", SqlDbType.NVarChar, 50).Value = txtStoreName.Text;
}
假设你使用的是原始的ADO.Net对象。如果你有一个像EntityFramework或Dapper这样的ORM,使用参数的机制会有一些不同。
重要的是 txtStoreName.Text
值永远不会被直接替换到SQL代码中,甚至在服务器上也不会。它与SQL代码是分开发送的,所以不可能用用户的输入污染SQL代码。你需要修正 每一个问题 在你的应用程序中这样工作,任何少了的东西都会被黑客攻击,这对于学习或原型来说太重要了,甚至不能做错。
这也往往会有更好的表现,因为它允许服务器解析一次查询代码并缓存执行计划。
Joel给出了正确的答案,但为了完整起见,我想补充一点,在T-SQL中,你可以通过添加另一个字符来转义字符串中的'字符。
所以,例如
INSERT INTO BookStores ([Name]) VALUES ('Roomie''s Books')
但就像乔尔说的,你应该 从来没有 做到这一点,特别是对于用户输入的数据,当从代码中向SQL Server传递数据时,使用参数代替。