下面是很多网站转载的原文
目前有很多无组件上传类,我大概看了一下,大多写的相当复杂,有的居然还只能传文本最关键的是没有10行代码以下的 :)我花了一个晚上时间研究了一下ADODB.Stream,并且用了6行代码实现了无组件上传:
strFileName = Request.QueryString("file1")
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1 '' adTypeBinary
objStream.Open
objStream.LoadFromFile strFileName
objStream.SaveToFile Server."123_onweb.gif",2
使用方法:
把上面的代码写成upload.asp
在浏览器里面输入:
http://XXX/upload.asp?file1=c:\上传文件\123.gif
XXX为你的主机地址
执行完后你会看到你的目录下面多了一个123_onweb.gif
他就是你要文件拉!!!!
根据原理我们可以扩展以下代码:
upload.asp文件
<%
Function GetFileName(ByVal strFile)
If strFile <> "" Then
GetFileName = mid(strFile,InStrRev(strFile, "\")+1)
Else
GetFileName = ""
End If
End function
strFileName = Request.Form("file1")
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1 '' adTypeBinary
objStream.Open
objStream.LoadFromFile strFileName
objStream.SaveToFile Server.MapPath(GetFileName(strFileName)),2
objStream.Close
%>
upload.htm文件
<form name="FORM" action="upload.asp" method="post">
<input type="submit" name="submit" value="OK">
<input type="file" name="file1" style="width:400" value="">
</form>
======================================
我一开始在本机上测试,果然可行,并加了大小、格式限制,也可以。
但上传到服务器上,问题来了。500错误,“文件无法被打开。”。
用baidu搜索了一下,在baidu的asp吧,发现了以下信息。
http://post.baidu.com/f?kz=4635658
(57楼和58楼)
========================================
这段代码肯定不行:
第一行 strFileName = Request.QueryString("file1") 只是传了一个文件名路径上去,服务器由于在本机所以按照这个路径能找到文件strFileName
所以第四行才能加载文件
objStream.LoadFromFile strFileName
第五行保存
objStream.SaveToFile Server.MapPath("123_onweb.gif"),2
其实对服务器来说这个文件本来就在服务器上,加载这个文件后重新保存了一个地方。这不是自欺欺人么,嘿嘿。
如果你的服务器在远程,试想服务器从d:\chang.jpg这个位置能找到这个文件么?
如果把这段代码放到服务器上反而还会造成巨大漏洞
攻击者修改file1的值就可以把你服务器上其他路径的文件复制到当前目录下甚至c盘
文件名为123_onweb.gif
然后他就可以下载这个文件
哈哈
[此贴子已经被作者于2006-5-15 16:31:49编辑过]