由 SQL Injection with Access MDB 想到……
昨天公司的技术交流会上,提到了对 SQL 语句注入攻击的防止方法之一就是不使用“拼接”字符串来构造 SQL 语句的方法,全部用参数传递的形式。
昨晚看《黑客X档案》中的几篇关于对 ASP 程序(极限论坛,雪人论坛)进行 SQL 注入攻击的文章,发现这几个程序的共同点都是从 QueryString 中获得参数值,在“拼接”成 SQL 查询语句——不被攻击才怪。
我在写 ASP 程序时,操作数据库(大多是 Access)部分基本是使用自己写的一个类,一开始也是用拼接字符串的方式,不过都首先对 QueryString 和 Form 传的参数进行了合法性校验,虽说不上万无一失,至少能防君子。后来扩充之后,加上了传参数的方式,用 ADODB.Command 的 Parameter 对象。部分代码如下:
'执行不返回记录集的查询
Public Sub ExecuteNonQuery(cmdText, cmdParms)
Set m_objCommand = Server.CreateObject("ADODB.Command")
With m_objCommand
.ActiveConnection = m_objConnection
.CommandText = cmdText
.CommandType = adCmdText
.Execute , cmdParms, adExecuteNoRecords
End With
Set m_objCommand = Nothing
End Sub
ADO 使用参数的方式也类似 SqlHelper,即参数数组。我的调用方式是 obj.ExecuteNonQuery "SELECT * FROM table1 WHERE uid = @uid", Array(uid)。要注意一点的就是,使用 Access 数据库,参数值数组中的变量的顺序必须和 SQL 语句中参数名出现顺序一致,SQL Server 则无所谓。
这个方法其实应该是 ASP 操作数据库的基本方法。然而,我很少在外面网站上见到过。
我想,正因为 ASP 简单易学,大多数人都是半路出家,随便看看就是了,铺天盖地的 ASP 教程上操作数据库部分都是建立 Connection-建立 Recordset-rs.Open ... 来操作,Command 对象甚至不提……唉,为何不读读《ASP 3 高级编程》这本红宝书呢?国外的 ASP 程序员就确实要专业得多。看看国内那些“著名”ASP 程序,比如动网论坛,那代码叫一个丑……CSDN ASP 版的多数问题也弱智得可以……
ASP,或者说 M$ 的东西,确实看上去简单,菜鸟和高手都能实现特定功能,但是,实现方式和细节方面就能看出水平差别了。
我不是高手,也不能算初级菜鸟,所以可以发牢骚,自己的 Blog 嘛~ASP 毕竟没落了,要学的东西很多……
没错,php也一样,看过了IPB的代码之后,感觉太优秀了。。。爽。。。。
确实我也是照rs那么学的,而且多年来一点进步没有,还只会rs……
原来如此……
虽然我已经很长时间没有使用ASP做开发,但是我觉得还是很好用的,单纯的ASP代码功能的确有限,也无法达到真正设计精良。考虑COM/COM+的应用也许会让你如鱼得谁
PS:居然现在不做开发了
确实,我觉得asp门槛低,很易学,很快上手,但是看完《asp3高级编程》觉得要编写真正的优秀的asp程序需要很深的技术功力和系统的编程思想,以前的程序都是垃圾。
你说的,因为asp门槛低,然后所以会看到很多不好的东西,这个感悟我觉得很不错
门槛就是这样的东西,以前basic经常后诟病和这个就有关系,呵呵
汗颜...
ASP....唉....
ps...今天发现青鸟健身也叫"nirvana"....
呵呵,之所以起名 nirvana:最早这个 Blog 程序是单人模式,我给班级做一个校友录(未完成)的附属品,主要目的是试验自己乱写的数据库操作类。
后来硬盘报废了,全部代码都没了,欲哭无泪,只好重来。
因而得名。
谁会IPB的SQL语句注入啊?
最近要搞一个ASP的项目,我也正要研究研究,希望以后多听高手的建议。
另外,我看上一本叫《ASP 3初级编程》的书,我知道的北京的书店和网上书店都是缺货,不知道这里的朋友有没有知道哪卖的?或者愿意转让旧书的?只要上面别有勾画的痕迹就行,谢谢了。
联系方式:
spoonystone@yahoo.com.cn