我应该如何处理表单中的单引号,以帮助防止SQL注入,使用WebMatrix剃须刀(C#)



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

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个字符(文本区域),一个最多可以容纳1000个字符。

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

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

有关参数化查询的详细信息,请参阅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();
//.....
}

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

通过禁止某些字符,您可以停止导致SQL注入的明显方法,但实际上不可能使用这些方法来停止所有可能的方法。

如果编码正确,就不会有导致问题的字符。对于数据库调用,最好的方法是使用参数化查询,这样数据库驱动程序就可以根据数据类型和特定数据库对正确的字符进行编码。

此外,当您以后使用这些值时,您需要正确地对它们进行编码,比如HTML代码中的HTML编码字符串、URL中使用的URL编码字符串(以及两者都用于HTML代码中URL中的字符串)

正如其他人所说,您应该使用参数化查询来防止SQL注入。

Alexei Levenkov提供了一个使用ADO.NET参数的好例子,但更常见的是,在处理参数处理略有不同的WebMatrix Razor页面(ASP.NET Web pages Framework)时,您将使用数据库帮助程序。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参数。

最新更新