[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[整理]ASP无组件文件上传时,文件名包含中文双引号时,文件名解析不完整的解决

上一篇:[转帖]IIS 文件名解析漏洞扼要分析
下一篇:[备忘]Eclipse查看UTF-8编码的注释乱码。

添加日期:2012/12/30 12:50:22 快速返回   返回列表 阅读2848次
如文件名为
大家“好”啊'a.txt
上传后,结果是“大家”

看一下原因,以稻香老农的化境无组件上传类为例。
假设上传的数据片段如下:
---------------------------------
Content-Disposition: form-data; name="text1" Content-Disposition: form-data; name="file1"; filename="E:\大家“好”啊'a.txt" 
Content-Type: text/plain
---------------------------------
上传类的部分代码如下:
---------------------------------
'指向下一个分隔符的起始位置
iFormStart = InStrB(iInfoEnd,RequestData,sStart)

'从Head中取得表单项目名称
iFindStart = InStr(22,sInfo,"name=""",1)+6
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))

'如果有"filename=",说明是文件项目
if InStr (45,sInfo,"filename=""",1) > 0 then
    '将文件名,路径等信息拆分出来,存入objFile集合。
    
    set theFile=new FileInfo 'new了一个FileInfo类的实例
    
    '取得文件名
    iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
    iFindEnd = InStr(iFindStart,sInfo,"""",1)
    sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
    theFile.FileName=getFileName(sFileName)
    
    '文件路径
    theFile.FilePath=getFilePath(sFileName)
    
    '取得文件类型
    iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14
    iFindEnd = InStr(iFindStart,sInfo,vbCr)
    theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart)
---------------------------------

关键在这两句:
    iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
    iFindEnd = InStr(iFindStart,sInfo,"""",1)
首先查找“filename=”,然后在后面查找双引号。
而此处内容为filename="E:\大家“好”啊'a.txt" 
查找到的位置是“大家”后面那个中文双引号。

也就是说,中文双引号与英文双引号,被认为是同义的了。
问题出在Instr函数上。
InStr([start, ]string1, string2[, compare])


'执行文本比较。
response.write instr(1,"abcABC","A",vbTextCompare)

'执行二进制比较 
response.write instr(1,"abcABC","A",vbBinaryCompare) 

'默认是二进制比较
response.write instr("abcABC","A") 


以上代码的输出是144.
二进制比较时,是按字符编码比较,“a”与“A”是不同的。
文本比较时,实际是做了字符是否同义的判断,比如“a”与“A”认为相同。
所以,实际上文本比较要比二进制比较慢一些。

修改办法,将上传类中的所有Instr函数的最后一个参数为1的都改为0即可。
InstrB函数不用修改。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved