我意识到参数化SQL查询是构建包含用户输入的查询时消毒用户输入的最佳方式,但我想知道使用用户输入并转义任何单引号并用单引号包围整个字符串有什么问题.这是代码:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Run Code Online (Sandbox Code Playgroud)
用户输入的任何单引号都被双单引号替换,这消除了用户结束字符串的能力,因此他们可能键入的任何其他内容(例如分号,百分号等)都将成为字符串的一部分而不是实际上作为命令的一部分执行.我们使用的是Microsoft SQL Server 2000,我相信单引号是唯一的字符串分隔符,也是逃避字符串分隔符的唯一方法,因此无法执行用户键入的任何内容.
我没有看到任何方法发起针对此的SQL注入攻击,但我意识到,如果这是像我看来一样的防弹,其他人会想到它,这将是常见的做法.我的问题是:这段代码有什么问题?有没有人知道通过这种清理技术获得SQL注入攻击的方法?利用此技术的示例用户输入将非常有用.
更新:
感谢大家的回答; 几乎我在研究中遇到的所有信息都出现在这个页面的某个地方,这表明那些在忙碌的日子里抽出时间帮助我解决这个问题的人的智慧和技巧.
我还没有接受任何答案的原因是我仍然不知道如何有效地针对此代码启动SQL注入攻击.有些人建议反斜杠会转义一个单引号而另一个引用字符串结束,以便字符串的其余部分作为SQL命令的一部分执行,我意识到这个方法可以将SQL注入一个mySQL数据库,但在MS SQL 2000中,唯一的方法(我能够找到)逃避单引号是另一个单一的qoute; 反斜杠不会这样做.除非有办法停止单引号的转义,否则其余的用户输入都不会被执行,因为它将全部作为一个连续的字符串.
我知道有更好的方法来消毒输入,但我真的更有兴趣了解为什么我上面提供的方法不起作用.如果有人知道对这种清理方法进行SQL注入攻击的任何特定方法,我很乐意看到它.
我正在寻找一种可以检测恶意请求的工具(例如明显的SQL注入获取或发布),并将立即禁止请求者的IP地址/添加到黑名单.我知道在理想的世界中我们的代码应该能够处理这些请求并相应地对待它们,但是即使站点不受这些攻击的影响,这样的工具也有很多价值,因为它可以导致节省带宽,防止分析膨胀等
理想情况下,我正在寻找一个LAMP/.NET
比技术堆栈更高级别的跨平台()解决方案; 也许是在网络服务器或硬件层面.不过,我不确定这是否存在.
无论哪种方式,我都希望听到社群的反馈,以便我可以看到我在实施和方法方面的选择.
我最近继承了一个经典的asp网站,其中包含大量内联SQL插入语句,这些语句易受SQL注入攻击.
这些insert语句通过ADO命令对象执行.
将ADO Command Object的Prepared属性设置为true可确保在执行前对参数进行参数化,从而降低SQL注入的风险吗?
我有这个有效:
sqlString = "SELECT * FROM employees WHERE lastname = '" & last_name & "'"
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = dbConn
cmd.CommandText = sqlString
cmd.Prepared = True
Set recs = cmd.Execute
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是在动态部分之上sqlString
是在准备好的语句命令之前.我不认为我上面的东西在保护我.
在执行预准备语句之前,我不必修复此sqlString吗?阅读本文让我想到: 准备好的语句如何防止SQL注入攻击?:
"虽然在准备好的陈述中,我们不会改变我们的计划,但它仍然完好无损.这就是重点.
我们首先将程序发送到服务器
$db->prepare("SELECT * FROM users where id=?");
Run Code Online (Sandbox Code Playgroud)
数据被称为"占位符"的变量替换,然后我们分别发送数据:
$db->execute($data);
Run Code Online (Sandbox Code Playgroud)
所以,它不能改变我们的计划并造成任何伤害.很简单 - 不是吗?"
但我不知道如何使我的查询正确.我也不知道他是怎么prepare
来的$data
.希望得到指导.谢谢.
我继承了大量的经典ASP代码,目前缺少SQL注入保护,我正在努力.我已经详细检查了这里提供的解决方案:经典ASP SQL注入保护 在数据库方面,我有一个Microsoft SQL Server 2000 SP4
不幸的是,存储过程不是一种选择.
在研究了php的mysql_real_escape_string(http://www.w3schools.com/php/func_mysql_real_escape_string.asp)之后,我在ASP中复制了它的功能.
我的问题是:
1)Microsoft SQL Server 2000是否有任何其他需要转义的特殊字符,这些字符在MySQL中不存在(\ x00,\n,\ r,\,',",\ x1a)
2)通过使用单引号转义单引号和周围用户输入,我可以通过答案来防止SQL注入吗? 我读到"对''引用参数'过程发起攻击的一种方法是使用字符串截断.根据MSDN,在SQL Server 2000 SP4(和SQL Server 2005 SP1)中,太长的字符串将被悄然截断."
如何将其用于攻击(我真的无法想象这样的场景)以及什么是正确的防范方法?
3)我应该注意哪些其他问题?注入SQL的任何其他方式?
注意:30分钟的互联网搜索表示,没有经典ASP的库可以防止SQL注入.是这样,还是我在搜索的基本任务中真的失败了?
我正在想办法解决以下问题,因为看起来有人这样做了,我想解决它。但是,在使用OWASP Recommendation 之类的东西修复它之前,我真的很想了解攻击的工作原理
Set conn = Server.CreateObject("ADODB.Connection")
conn.open xDb_Conn_Str
sSql = "SELECT * FROM [User]"
sSql = sSql & " WHERE [Username] = '" & CleanSql(sUserId) & "'"
Set rs = conn.Execute(sSql)
Run Code Online (Sandbox Code Playgroud)
CleanSql -
Function CleanSql(str)
Dim sWrk
sWrk = Trim(str&"")
sWrk = Replace(sWrk, "'", "''") ' Adjust for Single Quote
sWrk = Replace(sWrk, "[", "[[]") ' Adjust for Open Square Bracket
CleanSql = sWrk
End Function
Run Code Online (Sandbox Code Playgroud)
单引号显然在此转义。
在此之后,它将检查是否发现用户使用以下内容验证密码:
If UCase(rs("Password")) = UCase(sPassWd) Then
DoStuff()
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。
我们有一些经典的ASP页面连接到MS SQL服务器数据库.为了防止SQL注入,我们只需用双引号替换所有单引号.这似乎是这里规定的方法:http://www.4guysfromrolla.com/webtech/061902-1.shtml
这对我来说仍然很危险.有没有办法逃避任何其他角色的单引号,可能会打开SQL注入?
编辑:)我们目前有很多旧代码使用这个单引号来双倍单引号替换.如果这足以阻止SQL注入,那么我们不会改变任何东西.我真正的问题是这种方法是否不安全.