目前我根本不允许使用撇号(以及你能看到的其他角色),并为每个字段重复:
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的名字字段,等等。等等。
可能有其他(我不知道该怎么称呼它们,'插件?''在程序之外?')可以为我做这个工作,但这实际上是无用的,因为我不仅有不知道如何整合它,我不知道如何专门定制它到我的网络界面/数据库。
是否有任何代码可以帮助我从正常的撇号中检测sql注入撇号(通过它周围的字符?)?请记住,我的一些字段最多可容纳500个字符(textareas),最多可容纳1,000个字符。
感谢您的任何想法或帮助!
答案 0 :(得分: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();
//.....
}
答案 1 :(得分:1)
对于包含特定字符的输入,SQL注入不是问题,这是处理输入的问题。
通过禁止某些字符,您可以停止导致SQL注入的明显方法,但实际上不可能使用它来阻止所有可能的方式。
如果编码正确,则没有导致问题的字符。对数据库调用执行此操作的最佳方法是使用参数化查询,以便数据库驱动程序根据数据类型和特定数据库负责编码正确的字符。
此外,您需要在以后使用它们时正确编码值,例如HTML编码放入HTML代码的字符串,URL编码URL中使用的字符串(以及放在URL中的字符串)在HTML代码中。)
答案 2 :(得分:1)
您应该使用参数化查询来防止SQL注入,正如其他人已经说过的那样。
Alexei Levenkov提供了一个使用ADO.NET参数的好例子,但更常见的是,在使用WebMatrix Razor页面(ASP.NET Web Pages Framework)时,您将使用Database Helper,其中参数处理略有不同。 Database.Query方法(Query(string commandText,params object []参数)获取一个表示要执行的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参数。