如何防范SQl注入
作者:乔哲
在设计或者维护 Web 网站时,你也许担心它们会受到某些卑鄙用户的恶意攻击。的确,如今的 Web 网站开发者们针对其站点所在操作系统平台或Web 服务器的安全性而展开的讨论实在太多了。不错,IIS 服务器的安全漏洞可能招致恶意攻击;但你的安全检查清单不应该仅仅有 IIS 安全性这一条。有些代码,它们通常是专门为数据驱动(data-driven) 的 Web 网站而设计的,实际上往往同其它 IIS 漏洞一样存在严重的安全隐患。这些潜伏于代码中的安全隐患就有可能被称为“SQL 指令植入式攻击” (SQL injection) 的手段所利用而导致服务器受到攻击。
SQL 指令植入式攻击技术使得攻击者能够利用 Web 应用程序中某些疏于防范的输入机会动态生成特殊的 SQL 指令语句。举一个常见的例子:
某 Web 网站采用表单来收集访问者的用户名和密码以确认他有足够权限访问某些保密信息,然后该表单被发送到 Web 服务器进行处理。接下来,服务器端的ASP 脚本根据表单提供的信息生成 SQL 指令语句提交到 SQL 服务器,并通过分析 SQL 服务器的返回结果来判断该用户名/密码组合是否有效。
为了实现这样的功能,Web 程序员可能会设计两个页面:一个 HTML 页面 (Login.htm) 用于登录,另一个ASP 页面 (ExecLogin.asp) 用于验证用户权限(即向数据库查询用户名/密码组合是否存在)。具体代码可能象这样:
Login.htm (HTML 页面) 代码:
<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="txtUsername"><br>
Password: <input type="password" name="txtPassword"><br>
<input type="submit"> </form>
ExecLogin.asp (ASP 页面) 代码:
<%
Dim p_strUsername, p_strPassword, objRS, strSQL
p_strUsername = Request.Form("txtUsername")
p_strPassword = Request.Form("txtPassword")
strSQL = "SELECT * FROM tblUsers " & _ "WHERE Username=" & p_strUsername & _ " and Password=" & p_strPassword & ""
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (objRS.EOF) Then
Response.Write "Invalid login."
Else
Response.Write "You are logged in as " & objRS("Username")
End If
Set objRS = Nothing
%>
乍一看,ExecLogin.asp 的代码似乎没有任何安全漏洞,因为用户如果不给出有效的用户名/密码组合就无法登录。然而,这段代码偏偏不安全,而且它正是SQL 指令植入式攻击的理想目标。具体而言,设计者把用户的输入直接用于构建SQL 指令,从而使攻击者能够自行决定即将被执行的 SQL 指令。例如:攻击者可能会在表单的用户名或密码栏中输入包含“ or ”和“=” 等特殊字符。于是,提交给数据库的 SQL 指令就可能是:代码:SELECT * FROM tblUsers WHERE Username= or = and Password = or =
这样,SQL 服务器将返回 tblUsers 表格中的所有记录,而 ASP 脚本将会因此而误认为攻击者的输入符合 tblUsers 表格中的第一条记录,从而允许攻击者以该用户的名义登入网站。
SQL 指令植入式攻击还有另一种形式,它发生在 ASP 服务器根据 querystring 参数动态生成网页时。这里有一个例子,此 ASP 页面从 URL 中提取出 querystring 参数中的 ID 值,然后根据 ID 值动态生成后继页面:
代码:
<% Dim p_lngID, objRS, strSQL
p_lngID = Request("ID")
strSQL = "SELECT * FROM tblArticles WHERE ID=" & p_lngID
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (Not objRS.EOF) Then Response.Write objRS("ArticleContent")
Set objRS = Nothing
%>
在一般情况下,此 ASP 脚本能够显示具有特定 ID 值的文章的内容,而 ID 值是由 URL 中的 querystring 参数指定的。例如:当URL为 http://www.example.com/Article.asp?ID=1055 时,ASP 就会根据 ID 为 1055 的文章提供的内容生成页面。
如同前述登录页面的例子一样,此段代码也向SQL 指令植入式攻击敞开了大门。某些恶意用户可能会把 querystring 中的文章 ID 值偷换为“0 or 1=1”等内容(也就是说,把 URL 换成 http://www.example.com/Article.asp?ID=0 or 1=1) 从而诱使 ASP 脚本生成不安全的 SQL 指令如:
代码:SELECT * FROM tblArticles WHERE ID=0 or 1=1
于是,数据库将会返回所有文章的内容。
当然了,本例服务器所受的攻击不一定会引起什么严重后果。可是,攻击者却可能变本加厉,比如用同样的手段发送 DELETE 等 SQL 指令。这只需要简单地修改前述 URL 中的 querystring 参数就可以了!例如:任何人都可以通过 “http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles ” 之类的 URL 来访问 Web 网站。
SQL 指令植入式攻击的危害
SQL 指令植入式攻击可能引起的危害取决于该网站的软件环境和配置。当 Web 服务器以操作员(dbo)的身份访问数据库时,利用SQL 指令植入式攻击就可能删除所有表格、创建新表格,等等。当服务器以超级用户 (sa) 的身份访问数据库时,利用SQL 指令植入式攻击就可能控制整个 SQL 服务器;在某些配置下攻击者甚至可以自行创建用户帐号以完全操纵数据库所在的 Windows 服务器。
杜绝SQL 指令植入式攻击
杜绝SQL 指令植入式攻击的第一步就是采用各种安全手段监控来自 ASP request 对象 (Request 、 Request.QueryString 、 Request.Form 、 Request.Cookies 和 Request.ServerVariables) 的用户输入,以确保 SQL 指令的可靠性。具体的安全手段根据你的 DBMS 而异,下面给出的都是基于 MS SQL Server的例子。
在前述登录页面的例子中,脚本期望得到的两个输入变量 (txtUserName 和 txtPassword)均为字符串类型。无论用户在哪个参数中插入单引号,他都可能让数据库执行单引号中的 SQL 指令。为了杜绝此类SQL 指令植入式攻击,我们可以借助 Replace 函数剔除单引号,比如:
代码:p_strUsername = Replace(Request.Form("txtUsername"), "'", "")
p_strPassword = Replace(Request.Form("txtPassword"), "'", "")
在第二个例子中,脚本期望的输入变量是长整型变量 (ID) 。用户可以通过在 ID 参数中插入特殊字符来运行不安全的 SQL 指令。为了为了杜绝此类SQL 指令植入式攻击,我们只需要借助 CLng 函数限制 ID 值为长整型变量,比如:
代码:p_lngID = CLng(Request("ID"))
当用户试图在 ID 中包含特殊字符时,CLng 就会产生一个错误。
为了进一步减少SQL 指令植入式攻击的危胁,请务必清除客户端错误信息文本中的所有技术资料。某些错误信息往往泄露了技术细节,从而让攻击者可以看出服务器的安全漏洞所在。这里指的错误信息不但包括应用程序生成的消息框,还包括来自 IIS 的出错提示。为此,你可以禁止由 IIS 发送的详细错误信息,而改用自定义的出错页面。(关于创建自定义的出错页面的更多信息,请务必参阅 《Creating Custom ASP Error Pages》。)
最后,为了减轻SQL 指令植入式攻击的危害,请限制 Web 应用程序所用的数据库访问帐号权限。一般来说,应用程序没有必要以 dbo 或者 sa 的身份访问数据库。记住,给它的权限越少,你的网站越安全!你还可以考虑分别给每个需要访问数据库的对象分配只拥有必需权限的帐号,以分散安全漏洞。例如:同是前端用户界面,当用于公共场所时就比用于具有本地内容管理机制的平台时更加需要严格限制数据库访问权限。
文章来源:个人博客
更多关于 SQL注入,SQL,注入,防范 的文章
- [UTM]UTM安全设备在大企业中的未来探讨
- [新闻]美国竟是盗版源头 各类黑客工具热销
- [新闻]思科在华产品线大幅降价 金融危机拖累
- [资料]WatchGuard网络安全方案为尚德电力护航
- [新闻]今天你黑屏了吗?网络流行新段子
- [新闻]速用第三方工具补漏洞遏制木马入侵
- [应用案例]Qno侠诺城市小区网络接入解决方案
- [网页技术]解决杀毒软件误删asp文件的方法
- [SEO]一些值得注意的英文网站优化心得
- [新闻]金山WPS软件应对微软黑屏 日增50%安装
精彩专题
- [新闻]互联网企业裁员降薪正当时
- [新闻]09年关于微软10大预测 Windows7火爆
- [网页技术]深入了解Access数据库的4种安全方式
- [新闻]语摘:老外也谈中国“竞价门”
- [CDN]Google App Engine搭建自己的CDN
- [CDN]CDN技术在金融网络上的应用
- [新闻]尼尔森:中国网站10月流量排名报告
- [新闻]百度的38个“我”预示互联网2.0的崛起
- [新闻]SNS不被发现的四大盈利模式解密
- [SEO]活学活用 网站推广需要的1000次尝试
- [dudu]实现安全稳固的AD和DNS架构
- [mmet]找回丢失的管理员密码
- [宋家雨]别拿虚拟机不当固定资产
- [vvv]Juniper CTO:我看好100G
- [小希大人]關於cloudcompute對云計算
- [DU的世界]美国在反身份窃取方面努力
- [bigrong]向托马斯.弗里德曼致敬
- [blue]最近火起来的RUBY
- [淡月]国外十大著名IT类网站
- [宋家雨]失望的芯片虚拟化调查结果
- [姜子牙]采购大型化主机应对金融
- [小卡罗]再强也拼不过数据中心掉电
- [owenglyn]10大最流行开源软件!
- [淡月]QQ好友“集体出国”
- [ly]Ruby的日期和时刻
- [skke]快速排除PC上网故障
- [淡月]笔记本活拆键盘实录!(图)
- [姜子牙]Sun公司面临陨落
- [papada]生命游戏 c语言完成
- [淡月]裁员名单让你一次看个够!
- [江湖传闻] 自杀可增强公司竞争力
- [江湖传闻] 是什么冷落了中关村?
- [江湖传闻] 彩虹QQ外挂或致高层动荡
- [网管专区] 多线路叠加要注意的事项
- [网管专区] Web服务器Ping通不能访问
- [网管专区] 端口映射不成功找出原因
- [网管专区] 由故障性质排除网络故障
- [争议人物] 李想:汽车站大都是垃圾
- [争议人物] 梁永伦:上任半年别盛大
- [争议人物] 李一男:思维要转型
- [争议人物] 马化腾:曾想摆摊装电脑
- [争议人物] 梁念坚:14月挖来的高管!
- [IDC专区] “CMS文章”的汇总贴
- [IDC专区] 让中国web2.0去死!
- [网络安全] 能解任何电脑的开机密码
- [网络安全]教你如何防范U盘病毒
- [网络安全] 把自己的IP地址隐藏起来
- [网络安全] 六大措施保障网络安全
- [系统应用] 30秒完成清除任务
- [系统应用] 无线网络下载小技巧
- [新闻]互联网企业裁员降薪正当时
- [SEO]基础教程:关键词选择基本思路和分析过程
- [SEO]网站主要状态页细解以及与搜索引擎的关系
- [新闻]09年关于微软10大预测 Windows7火爆
- [网页技术]深入了解Access数据库的4种安全方式
- [新闻]太雷人了!十大最让人恼火的软件
- [SOA]最新调查:亚太地区SOA实施呈增加趋势
- [新闻]语摘:老外也谈中国“竞价门”
- [网页技术]PHP沉思录:Drupal的性能问题
- [新闻]尼尔森:中国网站10月流量排名报告
- [新闻]《福布斯》评出13位亿万富翁博客[组图]
- [新闻]互联网企业裁员降薪正当时
- [SEO]网站主要状态页细解以及与搜索引擎的关系
- [新闻]09年关于微软10大预测 Windows7火爆
- [新闻]微软Exchange Online时代挑战:云计算
- [新闻]Google Android:谷歌开源商业模式探索
- [数据中心管理]不容忽视:保护虚拟机环境下的数据安全
- [新闻]太雷人了!十大最让人恼火的软件
- [SOA]最新调查:亚太地区SOA实施呈增加趋势
- [新闻]语摘:老外也谈中国“竞价门”





