Asp.net 如何避免SQL注入

Asp.net 如何避免SQL注入,asp.net,sql,Asp.net,Sql,我有一个工具可以指出所有sql注入问题,我发现一个问题如下: “选择GB.BTN、GUP.CUST_用户名、GUP.EMAIL from GBS_BTN GB、GBS_USER_BTN GUB、GBS_USER_PROFILE GUP,其中GB.BTN=GUB.BTN和GUB.CUST_UID=GUP.CUST_UID和GB.ET_ID=”+strAccountID+“'ORDER BY CREATE_DATE DESC”,oCin” 请告诉我如何构造上述查询以避免sql注入?选项1:使用参数化

我有一个工具可以指出所有sql注入问题,我发现一个问题如下:

“选择GB.BTN、GUP.CUST_用户名、GUP.EMAIL from GBS_BTN GB、GBS_USER_BTN GUB、GBS_USER_PROFILE GUP,其中GB.BTN=GUB.BTN和GUB.CUST_UID=GUP.CUST_UID和GB.ET_ID=”+strAccountID+“'ORDER BY CREATE_DATE DESC”,oCin”


请告诉我如何构造上述查询以避免sql注入?

选项1:使用参数化查询而不是上下文字符串

更多信息可在此处找到:

选项2:使用参数化存储过程

选项3是使用Replace()对字符串进行转义,但这应该是最后的手段 软弱,而且有办法克服它

string sql = "Select * From someTable where SomeStringField = '" + myVariable.REplace("'", "''") + "'";
然后,在命令变量中添加参数。如下所示:

myCommand.Parameters.AddWithValue("@accountID", strAccountID);
您必须了解,该漏洞存在于以下事实中:如果Straccounted来自用户可编辑的控件,则它可能包含以下内容:

' drop table GBS_BTN --
这将导致程序运行部分查询,然后删除表


编辑:并且使用示例中的参数会导致用户键入的任何内容被转义,因此您不会受到此类攻击。正如其他人所建议的,您也可以使用存储过程。然后您将被迫使用示例中的参数。存储过程具有其他可能有助于或者你,但这是另一个讨论。

如果用户设法用精心编制的内容填充straccounted,强制忽略该语句,然后运行任意代码,则可能会发生SQL注入

可能会为您提供一些相关信息。阿维德的回答非常准确,因此让我引用以下重要部分:

  • 白名单验证:类型、长度、格式或接受的值
  • 若你们想被列入黑名单,那个就直接去吧。引用转义是好的,但在其他缓解措施的范围内
  • 使用命令和参数对象来准备和验证
  • 仅调用参数化查询
  • 更好的是,只使用存储过程
  • 避免使用动态SQL,不要使用字符串连接来生成查询
  • 如果使用SPs,还可以将数据库中的权限限制为仅执行所需的SPs,而不直接访问表
  • 您还可以轻松验证整个代码库是否仅通过SPs访问DB
虽然我不像他那样喜欢存储过程(它不能防止错误/坏代码,也不能防止SP中的EXEC语句错误处理单引号将无法防止SQL注入),但这是一个有趣的问题
阅读。

strAccountID=Convert.ToInt64(strAccountID);
构建包含用户提供的输入的数据库操作是非常合理的需要是合理的一般建议,它忽略了动态生成的SQL在作为参数化PreparedStatement的一部分构造时是合理安全的。我觉得这个清单太狭隘了。
' drop table GBS_BTN --