如何让MSSQL忽略用户给出的值里面的"'"?

问题描述 投票:0回答:1

我正在从C#中做一个插入操作,一切都很顺利,除了一个插入语句,用户写的东西,如 "室友的书 "在一个值,因为'操作符。我怎样才能让Sql忽略'里面的值?

sql sql-server sql-insert
1个回答
2
投票

它们被称为参数化查询。

你可能有这样的东西。

 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代码。你需要修正 每一个问题 在你的应用程序中这样工作,任何少了的东西都会被黑客攻击,这对于学习或原型来说太重要了,甚至不能做错。

这也往往会有更好的表现,因为它允许服务器解析一次查询代码并缓存执行计划。


0
投票

Joel给出了正确的答案,但为了完整起见,我想补充一点,在T-SQL中,你可以通过添加另一个字符来转义字符串中的'字符。

所以,例如

INSERT INTO BookStores ([Name]) VALUES ('Roomie''s Books')

但就像乔尔说的,你应该 从来没有 做到这一点,特别是对于用户输入的数据,当从代码中向SQL Server传递数据时,使用参数代替。

© www.soinside.com 2019 - 2024. All rights reserved.