2013-05-13 90 views
0

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

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

这可能是什么病最终会做,但我的问题是,我还是得打出来的关键字的完整列表,有一百个左右。当然,我现在可以完成而不是搜索并询问这个问题。但没有一个更简单的方法?现在我要去:

1创建一个HashSet 2中的所有关键字添加到HashSet的(CMON)对HashSet的 3验证用户输入

很想见步骤2将变得更加容易,任何有关SQL注入的其他建议还赞赏

+3

我想补充我的两分钱,EXCEPT,我没有变更权利,你会采取支票?如果银行关门,我希望能把你从哈维省存到银行。考虑到上面的每个大写字母都是一个SQL关键字,我不认为这是一个好方法...... – Sparky 2013-05-13 02:36:11

+1

一个好的方法是编写一个SQL存储过程从文本框中获取文本并执行查询...搜索SQL注入,你会发现为什么创建一个黑名单的话不是一个好方法 – Sparky 2013-05-13 02:37:31

+0

... iam使用存储过程...不需要仍然检查你的说法吗? – dwarf 2013-05-13 02:39:21

回答

2

如果你是路过搜索文本到一个存储过程,做这样的事情

WHERE search LIKE @inputParam 

SQL不允许注射承担在上面的片段中。

但是,如果你正在建设一个字符串变量,然后使用EXEC @sql或sp_execute @SQL,你很容易受到SQL注入。

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

0

使用。 Dapper-dot-net使得它很容易做到这一点:

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