0

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

获取SQL关键字(保留词)是否是一种程序化方式

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

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

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

4

3 回答 3

2

如果您将搜索文本传递到存储过程并执行类似的操作

WHERE search LIKE @inputParam  

SQL 将不允许在上述片段中发生注入。

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

于 2013-05-13T02:43:29.463 回答
2

在我看来,最好避免使用参数化 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-13T02:45:17.960 回答
0

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

IEnumerable<Row> results = connection.Query<Row>("SELECT column FROM table WHERE title LIKE @query", new { query = "SEARCHTERM" });
于 2013-05-13T04:39:10.983 回答