加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

ASP也使用ORM,给ASP上全部的SQL注入画上句号

发布时间:2023-05-29 13:43:44 所属栏目:Asp教程 来源:
导读:PS:KJ大牛写的文章,昨天跟一朋友聊天的时候提到了ADO的command查询,我竟然把这个东西给忘记了,看来记性真的是太差了,找到了kj大牛的文章,拜读一下。

一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~
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()
 
%>
 
 
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章