我可以使用哪些常见的SQL注入检查?

时间:2009-09-03 14:02:02

标签: sql-server-2005 sql-injection

我正在运行我的网络应用程序,我正在尝试测试系统的各个部分,以确保它们不能成功进行SQL注入。

我可以对textboxes / textareas等执行哪些常见的SQL注入检查,这些检查可以很好地检查漏洞?

我并不担心因为我在测试台上运行这个数据而损坏我的数据,所以如果它杀死了我的服务器或数据库就没关系。

我特意寻找可以使用的例子。我并不是在寻找整体技术,虽然我希望用我希望得到的例子来涵盖各种不同的技术。

8 个答案:

答案 0 :(得分:11)

您可能会发现this site有用

答案 1 :(得分:6)

如果您始终使用参数化查询或存储过程,则无需进行任何检查。

永远不要使用动态SQL,您可以根据用户的输入来构建SQL命令。这就是要求您清理输入的内容。

答案 2 :(得分:3)

1)如果您只使用不包含动态SQL的存储过程(并以寄生方式调用它们),那么您可以使用它们。
2)如果您只使用您的应用语言准备好的陈述,那么您很高兴 3)如果以上都不是,你必须用alliciation langauge特定的命令来扫描你的文字,但你不说哪种应用语言。

修改
士气高涨。如果它包含用户提供给您的任何文本,则永远不要在字符串中构建和执行SQL sommand。将用户给定的文本作为参数传递给sql命令。 SQL注入是用户通过他们给你的文本更改SQL命令。

示例:

Query="select * from users where userName='"+givenUserName+"'"

您认为查询将是:

 select * from users where userName='your_friend'

但是如果givenUserName是

'x';delete from users --

查询将最终成为:

select * from users where userName='x';delete from users --'

答案 3 :(得分:2)

只要确保你在任何地方使用SqlParameter个对象(假设.net),并且没有连接sql查询,你就可以完全免受SQL注入。

- 编辑

有些人说使用“存储过程”会产生影响。它没有。如果仍构建查询以动态执行存储过程,则存在风险:

string sql = "exec spFoo @Hello = '" + helloValue + "'";

使用现代语言(特别是.net)以参数执行查询的唯一方法是使用SqlParameter类,并指定适当的数据类型。

答案 4 :(得分:0)

SQL注入检查?你应该害怕字符串吗?

从长远来看,好多了

  1. 使用.NET的SqlParameters(它可以检查自己的注入恶作剧,而不是你希望在临时检查中完成)
  2. 避免SP中的动态SQL(因为即使是参数化的查询也可以通过连接字符串然后在后端执行它们而被意外输入置入)

答案 5 :(得分:0)

您也可以使用ASP ADO对象在经典ASP中使用参数。

这是一个小例子:

Dim conn, cmd, SQL, connstr
connstr = "My Connection String"
SQL = "SELECT Username FROM Users WHERE UserID = @UserID"

' Setup Connection and Command objects
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = connstr
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = SQL

' Create and add the parameter
cmd.Parameters.Append(cmd.CreateParameter("UserID", adParamInput, 50, ID))        

' Execute
cmd.Execute ()

自从我编写任何经典ASP以来已经很长时间了,所以这段代码可能无法正常工作。但是,它提供了如何在经典ASP中使用参数以及防止SQL注入的想法。

答案 6 :(得分:0)

使用参数很方便,但是保护自己免受SQL注入的唯一方法,也不是万无一失。

如果存储过程内部动态创建并对SQL代码执行EXEC(),则会丢失该保护的所有。如果您的应用程序中包含单个查询,并且不使用参数或转义,则您也会失去该保护。

参数不是魔术,你可以通过在构建SQL时使用转义函数来保护自己:

Public Shared Function StringToSql(ByVal s As String) As String
   If s Is Nothing Then Return "NULL"
   Return "N'" & Replace(s, "'", "''") & "'"
End Function

用法:

Sql = "INSERT INTO mytable(name) VALUES(" & StringToSql(username) & ")"

动臂。非常简单。甚至照顾nvarchar引用。

您可以将日期,数字,GUID等转换为字符串并将它们传递给上面的函数,但最好为您使用的每种数据类型创建单独的函数。

有一点需要注意:您必须使用每次构建查询 - 包含此数据的每个CRUD,无论是在应用程序层生成还是在存储过程内动态生成。

但你必须做同样的事情才能从参数中获益!无论哪种方式,您都必须改变习惯并审查您的代码。没有逃避(蹩脚的双关语)。

答案 7 :(得分:-2)

任何带有'的内容。