新手asp编程的基本法则与常见错误注意事项
日期:2021-09-05 22:07:02 来源:脚本之家
在论坛看到很多帖子代码中都有一个共同的基本错误,字段类型错误。
程序和数据库是紧紧相连的,数据库字段文本型或时间型的都使用单引号
比如下面这段修改语句:
conn.execute "update Counts set counts='"&counts&"' where num="&num&" and Atime='"&now()&"'"
等号左边都是字段名,等号右边是传值过来的变量名,counts 字段是文本型,所以写入时必须前后加单引号,无论是写入还是查询都一样,后面的查寻语句中,num 字段是数字型,所以前后就没有单引号了,Atime 字段是时间型所以前后也要加单引号。
最重要的是以ID查询,ID字段是唯一的并且数字类型,很明显查询ID号时前后也不能有单引号
conn.execute "update Counts set counts='"&counts&"' where id='"&id&"'" '错误写法
conn.execute "update Counts set counts='"&counts&"' where id="&id '正确写法
二、ACCESS 数据库连接
通常数据库连接有两种方式,新手基本不知道用哪一种方式,或者在什么情况下用哪一种,又或者不知道两者的原理
①直接连接数据库文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")
②通过数据源来连接数据库文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")
那么,两者到底哪一个好呢,当然是第二种,因为第一种其实就是客户端浏览器直接读取数据库的,所以安全方面差很多,第二种通过数据源连接,是以服务器数据源工具连接的,与客户端没关系,所以数据库不会暴露给客户端,安全系数高很多。
ACCESS 数据库对应程序的应用:①直接连接数据库文件
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")
这样的数据库连接方式,添加语句:
set rs=server.createobject("adodb.recordset") '(正确写法)
rs.open "select * from dndj",conn,1,3
rs.addnew
rs("bh") = bh
rs("bm") = bm
rs("xm") = xm
rs("xsq") = xsq
rs.update
rs.close
set rs=nothing
set rs=server.createobject("adodb.recordset") '(错误写法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3
ACCESS 数据库对应程序的应用:②通过数据源来连接数据库文件
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")
这样的数据库连接方式,添加语句:
conn.execute "insert into dndj(bh,bm,xm,xsq) values('"&bh&"','"&bm&"','"&xm&"','"&xsq&"')" '(正确写法)
set rs=server.createobject("adodb.recordset") '(错误写法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3
三、双引号的应用
通常我们写超级连接这样 <a href="abc.asp?id=<%=rs("id")%>">超级连接</a>
但要是把这个超级连接编译进asp里面呢
response.write "<a href=""abc.asp?id="&rs("id")&""">超级连接</a>" '(正确写法)
response.write "<a href='abc.asp?id="&rs("id")&"'>超级连接</a>" '(正确写法)
response.write "<a href=abc.asp?id="&rs("id")&">超级连接</a>" '(正确写法)
response.write "<a href="abc.asp?id=<%=rs("id")%>">超级连接</a>" '(错误写法)
response.write "<a href="abc.asp?id="&rs("id")&"">超级连接</a>" '(错误写法)
表单编译进asp里 <input type="text" name="id" value="<%rs("id")%>" />
response.write "<input type=""text"" name=""id"" value="""&rs("id")&""" />" '(正确写法) 注意:这里有三个双引号
response.write "<input type='text' name='id' value='"&rs("id")&"' />" '(正确写法)
response.write "<input type=text name=id value="&rs("id")&" />" '(正确写法)
response.write "<input type="text" name="id" value="<%=rs("id")%>" />" '(错误写法)
response.write "<input type="text" name="id" value=""&rs("id")&"" />" '(错误写法)
四、防止ACCESS数据库被下载的几个方法
很多动态站点大量应用了数据库,数据库理所当然成了一个站点的核心文件。一旦数据库被非法下载,极有可能被恶意人士破坏网站。或者窃取资料。
下面提供的方法分别适用使用虚拟主机空间的用户和有IIS控制权的用户!
一:购买虚拟主机空间的,适合没有IIS控制权
1:发挥你的想象力 修改数据库文件名
这个是最基本的。我想现在也没有多少连数据库文件名都懒得改的人吧? 至于改成什么,你自己看着办,至少要保证文件名复杂,不可猜测性。当然这个时候你的数据库所在目录是不能开放目录浏览权限的!
2:数据库名后缀改为ASA、ASP等
这个听说很流行,不过我测试了好多次,发现并不理想,如果真正要起到防止下载的作用,要进行一些二进制字段添加等设置,一句话,繁而复杂(如果你的数据库有很多的话,这个方法实在不是很好)
3:数据库名前加“#”
只需要把数据库文件前名加上#、然后修改数据库连接文件(如conn.asp)中的数据库地址。原理是下载的时候只能识别 #号前名的部分,对于后面的自动去掉,比如你要下载:http://bbs.bccn.net/date/#123.mdb(假设存在的话)。无论是IE还是FLASHGET等下到的都是http://bbs.bccn.net/date/index.htm
另外在数据库文件名中保留一些空格也起到类似作用,由于HTTP协议对地址解析的特殊性,空格会被编码为"%20",如http://bbs.bccn.net/date/123 456.mdb
下载时http://bbs.bccn.net/date/123%20456.mdb。而我们的目录就根本没有123%20456.mdb这个文件,所以下载也是无效的,即使你暴露了数据库地址,一般情况下别人也是无法下载,最好两种方法同时使用“#”+空格,例如 http://bbs.bccn.net/date/#123 456.mdb
4:加密数据库
用ACCESS将你的数据库以独占方式打开后,在工具-安全-设置数据库密码,加密后要修改数据库连接页, 如:
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq=数据库路径"
这样修改后,数据库即使被人下载了,别人也无法打开(前提是你的数据库连接页中的密码没有被泄露)
但值得注意的是,由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行“异或”来形成一个加密串,并将其存储在*.mdb文件从地址“&H42”开始的区域内。所以一个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其安全依然是个未知数。
二:有主机控制权 (当然虚拟空间的设置在这里依然可以用)
5:数据库放在WEB目录外
如你的WEB目录是e:\webroot,可以把数据库放到e:\data这个文件夹里,在e:\webroot里的数据库连接页中
修改数据库连接地址为:"../data/#123 456.mdb" 的形式,这样数据库可以正常调用,但是无法下载的,因为它不在WEB目录里!这个方法一般也适合购买虚拟空间的用户。
6:使用ODBC数据源。
在ASP等程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码的失密而一同失密
例如:
conn.open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("../123/abc/asfadf.mdb")
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。
如果使用ODBC数据源,就不会存在这样的问题了:conn.open "ODBC-DSN名" ,不过这样是比较烦的,目录移动的话又要重新设置数据源了!
7:添加数据库名的如MDB的扩展映射
这个方法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机用户(除非管理员已经设置了)。这个方法我认为是目前最好的。只要修改一处,整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载。
设置:
在 IIS属性---主目录---配置---映射---应用程序扩展那里添加.mdb文件的应用解析。注意这里的选择的DLL(或EXE等)似乎也不是任意的,选择不当,这个MDB文件还是可以被下载的, 注意最好不要选择选择asp.dll等。你可以自己多测试下
这样修改后下载数据库如:http://bbs.bccn.net/data/dvbbs6.mdb。就出现(404或500等错误)
8:使用.net的优越性
动网的木鸟就写过一个防非法下载文件的“WBAL 防盗链工具”。记得本论坛曾经也有位牛人也发表过数据库防下载的插件,是.dll的加载到IIS里的。
不过 那个只实现了防止非本地下载的 ,没有起到真正的防下载数据库的功能。不过这个方法跟第5种差不多
可以通过修改.NET文件,实现本地也不能下载!
这几个方法中,只有第7和8个是统一性改的,一次修改配置后,整个站点的数据库都可以防止下载,其他几个就要分别修改数据库名和连接文件,比较麻烦,不过对于虚拟主机的朋友也只能这样了!
其实第6种方法应该是第5种方法的扩展,可以实现特殊的功能,但对于不支持.net的主机或者怕设置麻烦的话,还是直接用第5种方法了,而且默认情况下第6种方法,依然可以通过复制连接到同主机的论坛或留言本发表,然后就可以点击下载了(因为这样的引用页是来自同主机的)
这几个方法各有长短,请自己选择性地使用。这些方法也不是绝对的安全,还需要网站管理员平时注意一些系统的安全,以及写ASP代码本身的安全 ,否则依然有可能被人下载或者修改数据库!
您感兴趣的教程
在docker中安装mysql详解
本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...
win10中文输入法仅在桌面显示怎么办?
win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...
一分钟掌握linux系统目录结构
这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...
PHP程序员玩转Linux系列 Linux和Windows安装
这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...
win10怎么安装杜比音效Doby V4.1 win10安装杜
第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...
纯CSS实现iOS风格打开关闭选择框功能
这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...
Win7如何给C盘扩容 Win7系统电脑C盘扩容的
Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...
百度推广竞品词的投放策略
SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...
Visual Studio Code(vscode) git的使用教程
这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...
七牛云储存创始人分享七牛的创立故事与
这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...
Win10预览版Mobile 10547即将发布 9月19日上午
微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...
HTML标签meta总结,HTML5 head meta 属性整理
移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...
移动端html5模拟长按事件的实现方法
这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...
HTML常用meta大全(推荐)
这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...
cdr怎么把图片转换成位图? cdr图片转换为
cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...
win10系统怎么录屏?win10系统自带录屏详细
当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...