如果我允许用户在文本框中键入内容,然后对我的数据库执行搜索,则可能会出现sql注入。我可以使用正则表达式,这是我的第一个想法。但我有个更好的主意。为什么不看看他们输入的内容中是否有SQL关键字。我使用的是SQL Server数据库,在一个使用c#的ASP.NET程序中,我认为微软会为我所说的提供一个简单的解决方案。我能找到的最好的是这篇文章:
Is it a programmatic way to get SQL keywords (reserved words)
这可能就是我最终要做的,但我的问题是我仍然需要输入整个关键字列表,大约有100个。当然,我现在可以完成了,而不是搜索和询问这个问题。但是有没有更简单的方法呢?现在我要:
1创建Hashset 2将所有关键字添加到hashset (cmon) 3根据hashset验证用户输入
我希望看到步骤2变得更容易,任何其他关于sql注入的建议也是值得感谢的
发布于 2013-05-13 10:43:29
如果要将搜索文本传递到存储过程中,并执行如下操作
WHERE search LIKE @inputParam SQL将不允许在上面的片段中引入注入。
但是,如果您正在构建字符串变量,然后使用EXEC @sql或SQL @SQL,则很容易受到sp_execute注入的攻击。
发布于 2013-05-13 10:45:18
在我看来,最好使用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。
发布于 2013-05-13 12:39:11
使用命名参数。Dapper-dot-net让这件事变得非常容易:
IEnumerable<Row> results = connection.Query<Row>("SELECT column FROM table WHERE title LIKE @query", new { query = "SEARCHTERM" });https://stackoverflow.com/questions/16514071
复制相似问题