当前位置: 首页 > 图文教程 > 网络编程 > ASP > ASP也使用ORM,给ASP上所有的SQL注入画上句号

ASP
asp实现取得数组中的最大值的代码
asp 将日期格式化为需要的格式
asp 下产生任意位数随机密码的代码
asp下返回以千分位显示数字格式化的数值
asp重定向页面的方法总结
asp下去除数组中重复的项的方法
asp下实现 重新排序数字数组的代码
asp 验证输入网址是否有效并可以访问 与正则验证输入网址
asp验证Ip格式的函数
asp实现生成由数字,大写字母,小写字母指定位数的随机数
asp 格式化sql中的like字符串
asp 实现显示所有的服务器变量值的函数
asp 取得用户真实IP,对代理地址仍然有效的函数
asp 通用数据库连接过程函数
asp 字符串截取函数
asp下实现格式化文件大小以MB显示的函数
asp 下用正则表达式检测邮箱格式的函数
asp 实现检测字符串是否为纯字母和数字组合的函数
asp代码实现检测组件是否安装的函数
asp通过JMAIL实现通用发送函数

ASP也使用ORM,给ASP上所有的SQL注入画上句号


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 63 ::
收藏到网摘: n/a

PS:KJ大牛写的文章,昨天跟一朋友聊天的时候提到了ADO的command查询,我竟然把这个东西给忘记了,看来记性真的是太差了,找到了kj大牛的文章,拜读一下。 一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~
看以下的代码
<%
dim conn,rs
set conn=CreateObject("Adodb.Connection")
conn.open ....
set rs=conn.execute("select * from news");
...
遍历 rs....
%>
这样实现速度快是肯定的了,但是在结构逻辑上面1条半条语句当然不觉得怎样!语句多了问题也就来了!
参数没过滤啊,SQL存在注入啊等等~OK 现在我们来换个设计模型!
采用 3层结构 + ORM
ORM : OBJECT RELATION MAPPING
那什么是 ORM技术呢? 熟悉JAVA .NET开发的朋友一定很清楚...就是对象关系映射
把表映射为类 字段映射为属性 而记录则映射为对象...现在JAVA的ORM持久层框架N多
例如hibernate ibatis EntityBean(EJB其中一种)
那在ASP上面呢? 我们也一样可以实现.等等介绍
3层结构 : WEB展现层 中间层 持久层
以下有一个news 的表 简单一点的
create table news(
id int,
title varchar(200),
contect varchar(50000)
)
我们把他映射为类
<%
Class News
private id,title,contect
Sub setID(sid)
id=Cint(sid)
End Sub
Function getID
getID=id
End Function
Sub setTitle(stitle)
title=mid(stitle,1,200)'限制了长度
End Sub
....
End Class
%>
然后我们再设计如何操作数据库转换为对象的代码
<%
Class NewsDataAccessObject
dim conn,rs,cmd
'查询一篇新闻
Function getNewsByID(id)
set conn=Applcation("connection")'连接池里面获取一个连接
set cmd=GetCmd() ' GETCMD函数实现 return createobject("Adodb.Command")
selectString="select * from NEWS where id = @id"
cmd.ActiveConnection = conn
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = selectString
'为刚刚的的@id追加参数,常量 adInteger = 3 adParamInput=1
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , id)
'运行SQL语句 返回结果集合
set rs=cmd.execute()
dim anews
set anew=new News
if rs.eof then
else
anew.setID(rs("id")&"")
anew.setTitle(rs("title")&"")
anew.setContect(rs("Contect")&"")
end if
rs.close
set rs=nothing
set cmd=nothing
set conn=nothing
set getNewsByID=anew
End Function
'插入一篇新闻
Function addNews(anew)
dim conn,cmd
if isempty(anew) then addNews=false
set conn=Applcation("connection")'连接池里面获取一个连接
set cmd=GetCmd() ' GETCMD函数实现 return createobject("Adodb.Command")
insertString="insert into NEWS(id,title,contect) values( @id , @title , @contect )"
cmd.ActiveConnection = conn
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = insertString
'为刚刚的的@id @title @contect追加参数,常量 adInteger = 3 adParamInput=1 adVarWChar = 202
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , anew.getID() )
cmd.Parameters.Append cmd.CreateParameter("@title",adVarWChar, adParamInput, 200 , anew.getTitle() )
cmd.Parameters.Append cmd.CreateParameter("@contect",adVarWChar, adParamInput, 50000 , anew.getConect() )
'运行SQL语句
cmd.execute()
set cmd=nothing
set conn=nothing
addNews=true
End Function
Function findByTitle(stitle)
....
End Function
Function getPageNews(page,size)
....
End Function
End Class
%>
以上就是对数据库操作然后把结果封装到对象里面 或者把对象写入数据库
这样实现虽然速度上面会稍慢 但是总体逻辑结构非常明显,不需要关心变量是否已经给过滤或者多过滤
而web页面层的设计人员更多的关注于界面方面
以下为提交添加新闻代码
<%
dim id,title,contect,anew,dao
id=Request("id")
title=Request.Form("title")
contect=Request.Form("contect")
set anew=new NEWS
anew.setID(id)
anew.setTitle(title)
anew.setContect(contect)
set dao=new NewsDataAccessObject
if dao.addNews(anew) then
'response.write
echo "success"
else
echo "error"
end if
%>
把新闻查出来显示
<%
dim id,dao,anew
id=Request("id")
set dao=new NewsDataAccessObject
set anew=dao.getNewsByID(id)
if anew.getID()<>"" then
%>
标题:<%=anew.getTitle()%>
内容:<%=anew.getContect()%>
.....
以上片段代码如有错漏谢谢指点~~~
使用这样的设计方式就根本不需要像XXXBLOG XXXBBS XXX文章系统那样
忘记Replace(SQL,"'","''") 而产生injection了!
对于页面的整洁性而言 也不会出现SQL语句,连接等 美工负责好自己的工作然后把对象的属性放到相应的位置就OK
而有可能有朋友会觉得 用户认证方面呢!那更省事了把用户表的用户对象放到session里面就OK
<%
if isempty(session("user")) or session("user")="" then
'跳转
else
set auser=session("user")
echo "欢迎你:" & auser.getName()
%>