在C#中检查SQL关键字

时间:2013-05-13 02:26:41

标签: c# asp.net sql-injection keyword

如果我允许用​​户键入文本框然后对我的数据库执行搜索,则可能会进行sql注入。我可以使用正则表达式,这是我的第一个想法。但我有一个更好的主意。为什么不看看他们输入的内容是否包含任何SQL关键字。我使用SQL Server数据库,在一个带有c#的ASP.NET程序中,我认为微软会为我所说的提供一个简单的解决方案。我能找到的最好的就是这篇文章:

Is it a programmatic way to get SQL keywords (reserved words)

这可能是什么病最终做,但我的问题是我仍然要输入整个关键字列表,有大约一百。确定我现在可以完成,而不是搜索和问这个问题。但是不是更简单的方法吗?现在我要去:

1创建一个哈希集 2将所有关键字添加到hashset(cmon) 3根据哈希集验证用户输入

很想看到第2步变得更容易,关于sql注入的任何其他建议也值得赞赏

3 个答案:

答案 0 :(得分:2)

如果要将搜索文本传递给存储过程并执行类似

的操作
WHERE search LIKE @inputParam  

SQL不允许在上面的片段中引入注入。

但是,如果要构建字符串变量然后使用EXEC @sql或sp_execute @SQL,则很容易受到SQL注入攻击。

答案 1 :(得分:2)

在我看来,最好避免使用parameterized SQL完全避免检查SQL关键字的问题。这是C#中的一个示例(假设您使用的是MS SQL Server):

using (SqlCommand sqlcmd = new SqlCommand("SELECT * FROM [MyDB].[dbo].[MyTable] WHERE [SomeColumn] = @SomeValue", sqlconnection))
{
    sqlcmd.Parameters.AddWithValue("@SomeValue", strUsersSearchString);

    // use sqlcmd.ExecuteReader() here 
    // or whatever you normally would
}

这是MSDN上的另一个例子。这个使用参数化SQL来调用存储过程:http://msdn.microsoft.com/en-us/library/ff648339.aspx#paght000002_step3

答案 2 :(得分:0)

使用命名参数。 Dapper-dot-net可以很容易地做到这一点:

IEnumerable<Row> results = connection.Query<Row>("SELECT column FROM table WHERE title LIKE @query", new { query = "SEARCHTERM" });