1

目前,我根本不允许使用撇号(以及您可以看到的其他字符),并为每个字段重申:

foreach(char c in Comments)
    {
        if(c=='\'' || c=='$' || c=='\"' || c=='&' || c=='%' || c=='@' || c=='-' || c=='<' || c=='>')
        {
            errorMessage = "You have entered at least one invalid character in the \"Comments\" field. Invalid characters are: [\'], [\"], [&], [$], [@], [-], [<], [>], and [%]";
        }
    }

我已经编写了一段时间,而且我越来越好,但真正的问题是,虽然我确信有一种方法可以有效地“剥离”或以其他方式验证用户输入,但我不确定哪个方法是最好的,在安全危机迫在眉睫之前可能不会。

如果必须,我将决定根本不允许在表单中使用单引号(就像现在一样),但这可能会加重任何命名的人说......名称字段的 Bill O'Reilly 等,等等。

可能还有其他(好吧,我不知道该怎么称呼它们,“插件?”“外部程序?”)可以为我完成这项工作,但这实际上是无用的,因为我不仅不知道如何要集成它,我不知道如何专门针对我的 Web 界面/数据库进行定制。

是否有任何代码可以帮助我从正常的撇号中检测到 sql 注入撇号(可能通过它周围的字符?)?请记住,我的某些字段最多可容纳 500 个字符(文本区域),一个最多可容纳 1,000 个字符。

感谢您的任何想法或帮助!

4

3 回答 3

5

再多的输入编码/清理都不会像参数化查询那样安全。

有关参数化查询的详细信息,请参阅SqlCommand.Parameters

string commandText = "SELECT * FROM Sales WHERE CustomerID = @ID;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@ID", SqlDbType.Int);
    command.Parameters["@ID"].Value = customerID;
    var reader = command.ExecuteReader();
    //.....
}
于 2012-10-04T16:55:20.903 回答
1

SQL 注入不是包含特定字符的输入的问题,而是您如何处理输入的问题。

通过禁止某些字符,您可以阻止导致 SQL 注入的明显方式,但几乎不可能使用它来阻止所有可能的方式。

如果编码正确,则没有导致问题的字符。对数据库调用执行此操作的最佳方法是使用参数化查询,以便数据库驱动程序负责根据数据类型和特定数据库对正确字符进行编码。

此外,您需要在以后使用它们时正确编码这些值,例如放在 HTML 代码中的 HTML 编码字符串、在 URL 中使用的 URL 编码字符串(以及放在 HTML 中的 URL 中的字符串)代码。)

于 2012-10-04T16:58:18.490 回答
1

正如其他人已经说过的那样,您应该使用参数化查询来防止 SQL 注入。

Alexei Levenkov 提供了使用 ADO.NET 参数的一个很好的示例,但更常见的是,在处理参数处理略有不同的 WebMatrix Razor 页面(ASP.NET 网页框架)时,您将使用数据库助手。Database.Query方法 (Query(string commandText, params object[] parameters) 接受一个表示要执行的 SQL的字符串和一个表示要传递给 SQL 的参数值的对象数组。数据库助手需要参数标记从 @0 开始,每次递增 1,例如

var sql = "SELECT * From MyTable WHERE TheDate > @0 AND ID > @1";

然后以下列方式传递实际值:

var data = Database.Open("MyDb").Query(sql, Request["date"], Request["id"]);

在内部,Database 类负责将值与占位符匹配并为您创建 ADO.NET 参数。

于 2012-10-05T07:05:34.770 回答