如果我允许用户键入文本框然后对我的数据库执行搜索,则可能会进行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注入的任何其他建议也值得赞赏
答案 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" });