File upload 在经典asp中上载文件

File upload 在经典asp中上载文件,file-upload,vbscript,asp-classic,File Upload,Vbscript,Asp Classic,我一直使用下面的脚本在classic asp中上载文件,但由于出现此错误,它停止工作 vbscript运行时错误800a01a8 需要对象“项(…)” 我做了一点调查,认为问题出在upload.asp文件中的BuildUploadRequest函数,但我真的不明白为什么 形式 表单到达的页面 byteCount=Request.TotalBytes RequestBin=Request.BinaryRead(字节数) Dim上传请求 设置UploadRequest=CreateObject(

我一直使用下面的脚本在classic asp中上载文件,但由于出现此错误,它停止工作

vbscript运行时错误800a01a8
需要对象“项(…)”

我做了一点调查,认为问题出在upload.asp文件中的BuildUploadRequest函数,但我真的不明白为什么

形式

表单到达的页面
byteCount=Request.TotalBytes
RequestBin=Request.BinaryRead(字节数)
Dim上传请求
设置UploadRequest=CreateObject(“Scripting.Dictionary”)
BuildUploadRequest(RequestBin)//upload.asp中定义的函数
如果UploadRequest.Item(“key”).Item(“Value”)=“0”,则“//这是给出错误的行
“//这里的代码。。。
如果结束
upload.asp
子构建上传请求(RequestBin)
PosBeg=1
PosEnd=InstrB(PosBeg、RequestBin、getByteString(chr(13)))
边界=MidB(RequestBin、PosBeg、PosEnd-PosBeg)
boundaryPos=InstrB(1,RequestBin,boundary)
“//获取边界内的所有数据
直到(boundaryPos=InstrB(RequestBin、boundary和getByteString(“--”)为止)
“//对象的变量成员放在dictionary对象中
Dim上传控制
设置UploadControl=CreateObject(“Scripting.Dictionary”)
“//获取对象名称
Pos=InstrB(BoundaryPos、RequestBin、getByteString(“内容处置”))
Pos=InstrB(Pos、RequestBin、getByteString(“name=”))
PosBeg=Pos+6
PosEnd=InstrB(PosBeg、RequestBin、getByteString(chr(34)))
Name=getString(MidB(RequestBin、PosBeg、PosEnd-PosBeg))
PosFile=InstrB(BoundaryPos、RequestBin、getByteString(“filename=”))
PosBound=InstrB(PosEnd、RequestBin、boundary)
“//测试对象是否为文件类型
如果PosFile0和(PosFile请尝试此上载代码(归功于Lewis Moten):

我最近在将站点迁移到更新版本的Windows Server时遇到了同样的问题。使用Lewis Moten的上载代码解决了这个问题

如果链接失效,代码也会发布到。

修复#1-卸载“KB3104002 IE11累积安全更新”

修复#2将所有字节数组复制到一个字节值字符串中,并针对该字符串进行操作,或者为instrb提供一个替代品,该替代品在数组上进行自己的迭代

Function InstrBNew(startPos, inputArray, searchChar)

  if LenB(searchChar) = 1 Then
    Dim loc
    For loc = startPos to Lenb(inputArray)
      if MidB(inputArray, loc, 1) = searchChar then Exit For
    Next
    InstrBNew = loc
  Else
    InstrBNew = InstrB(startPos, inputArray, searchChar)
  End If
End Function
修复程序#3-微软发布了一个修补程序。该修补程序将于2016年1月发布给所有人。您可以在这里尽早获得

问题似乎是vbScript中的InstrB函数现在在以下条件下返回值1

  • 搜索字节数组时(如Response.binarydead)。这在ASP或VBScript中并不常见,但文件上载是执行此操作时的一种情况
  • 当您搜索单个字节时
如果您正在搜索字符串,或者如果您正在搜索多字节模式,那么InstrB工作正常

PosEnd = InstrB(PosBeg, ByteArray, chrb(13))
在我损坏的系统上,此函数始终返回1,即使位置1处没有字节值13。在搜索字节数组时,任何值都返回1。经典的ASP文件上载组件(这就是为什么我们都在这个线程上)会遇到这种情况,因为它们正在解析字节数组以查找分隔符

PosEnd = InstrB(PosBeg,ByteArray,getByteString("FormBoundary"))
PosEnd = InstrB(PosBeg,ByteArray,getByteString(vbCRLF))
PosEnd = InstrB(PosBeg,"Normal string", chrb(103)) ' Search for letter g in a string
上面这些行工作正常,正如预期的那样。多字节搜索和匹配字符串的工作正常

昨晚我在多台服务器上同时遇到了这个问题。我看到windows系统更新也在昨晚运行。缩小范围后,我发现MS15-124(KB3104002 IE11的累积安全更新)包含vbscript.dll的更新。我删除了此更新,现在代码恢复正常工作

我在他们的“IE连接”系统上提出了一个问题,因为它包含在IE更新中,但我不确定这是否是正确的地方

我附加了一个测试用例。在坏的系统上,它将返回“5,1,5”。在工作系统上,它将返回“5,5,5”

希望得到修复。一些旧代码正在我无法访问的系统上运行

' Test.vbs
Dim byteArray, byteArray2, byteArray3, bPosition
Dim responseText

' byte string
' "hello hello"
byteArray = chrb(104) & chrb(101) & chrb(108) & chrb(108) & chrb(111) & chrb(32) & chrb(104) & chrb(101) & chrb(108) & chrb(108) & chrb(111) & chrb(0)

' byte array - What Response.BinaryRead is
byteArray2 = TextToBytes(byteArray)

' Vartype: http://stackoverflow.com/questions/3281355/get-the-type-of-a-variable-in-vbscript
ResponseText = ResponseText + "blen: " & lenb(byteArray) & vbCRLF
ResponseText = ResponseText + "type: " & vartype(byteArray) & vbCRLF

ResponseText = ResponseText + "blen: " & lenb(byteArray2) & vbCRLF
ResponseText = ResponseText + "type: " & vartype(byteArray2) & vbCRLF

bPosition = instrb(1, byteArray, chrb(111))
ResponseText = ResponseText + "Position in string: " & bPosition & vbCRLF

bPosition = instrb(1, byteArray2, chrb(111))
ResponseText = ResponseText + "Position in byte array: " & bPosition & vbCRLF

bPosition = instrb(1, byteArray2, chrb(111) & chrb(32))
ResponseText = ResponseText + "Position in byte array: " & bPosition & vbCRLF

WScript.Echo ResponseText

' Converts a string (8) to a vbArray of bytes (8192 + 17)
' I'm not sure how else to create a vbArray of bytes. It does not seem to be a common data type in vbscript
Private Function TextToBytes(ByRef pbinBinaryData)
    Dim lobjRs
    Dim llngLength
    Dim lbinBuffer
    CONST adLongVarBinary = 205
    llngLength = LenB(pbinBinaryData)
    Set lobjRs = CreateObject("ADODB.Recordset")
    Call lobjRs.Fields.Append("BinaryData", adLongVarBinary, llngLength)
    Call lobjRs.Open()
    Call lobjRs.AddNew()
    Call lobjRs.Fields("BinaryData").AppendChunk(pbinBinaryData)
    Call lobjRs.Update()
    lbinBuffer = lobjRs.Fields("BinaryData").GetChunk(llngLength)
    Call lobjRs.Close()
    Set lobjRs = Nothing
    TextToBytes = lbinBuffer
End Function

我在经典ASP中也遇到了同样的问题,InStrB突然返回1,即使我在调试器中验证它不应该返回1,即所讨论的字符位于位置17

我为InStrB编写了以下替换函数(仅在查找1个字符时使用)。我是一个蹩脚的VBS程序员,所以,请随意清理它。但它似乎确实有效

私有函数findCharInStrB(startPos、inputArray、searchChar)
暗线
对于loc=从startPos到Len(输入阵列)
如果MidB(inputArray,loc,1)=searchChar,则退出
下一个
findCharInStrB=loc
端函数

由于代表性低,我无法回复原始评论,但如果您无法使用常规控制面板方法删除更新,就像我无法删除一样(它没有出现在卸载列表中),下面是使用Powershell和命令行执行更新的方法:

卸载“KB3104002 IE11累积安全更新”的临时解决方案:

执行以下操作以检查是否安装了更新:

  • 轻按Windows键(或右键单击Windows按钮等),键入“cmd”,然后按enter键
  • 键入“powershell”,然后按enter键
  • 使用命令“get hotfix-id KB3104002”确定是否安装了更新。如果安装了,您将看到返回的列表,其中包含此更新的安装日期
  • 如果安装了更新,请继续:

  • 如果您仍在powershell中,请键入“退出”以离开
  • 使用命令'wusa/uninstall/kb:3104002'卸载修补程序
  • 重新启动
  • 警告:被列为“关键安全更新”,因此我不建议永远忽略此更新,但作为此更新导致的问题的临时解决方案,我选择这样做。我认为Microsoft将是