由于“注入”其他信息,内容类型验证失败

时间:2013-09-27 22:03:54

标签: iis asp-classic character-encoding content-type response-headers

我们有第三方软件,要求明确传入的Content-Type:

应用程序/ x-WWW窗体-urlencoded

但是,在下面的ASP脚本中,即使我们正确设置了请求标头,ASP实际上也是这样发送的:

应用程序/ x-WWW窗体-urlencoded;字符集= UTF-8

因此,身份验证失败,因为它是第三方,我们可能无法自行修补它,因为未来的更新可能会覆盖我们的修改。

我们如何明确强制Content-type并防止附加“; charset = utf-8”?

<%
'IRISLink.cgi expects application/x-www-form-urlencoded

Dim obHTTP
obHTTP.open "POST", "https://" & DWHost & "/IRISLink.cgi", False

obHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
obHTTP.Send strPost
Set obHTTP = Nothing

'Failure - Actual Content-type received was: application/x-www-form-urlencoded; charset=utf-8
%>

2 个答案:

答案 0 :(得分:1)

我不确切知道您正在使用哪个对象,但根据我的测试,我只能重现您在使用MSXML2.ServerXMLHTTP时所描述的行为。这通常指向MSXML 3.0版本。一个相对简单的修复方法是明确使用不同版本的MSXML,例如MSXML2.ServerXMLHTTP.6.0

如果由于某种原因无法实现,您可以将ADODB.Stream对象传递给send方法而不是字符串。有关此示例,请参阅我的测试脚本。

测试脚本:

Option Explicit

Dim strPost
strPost = "Testing 1,2,3"

Dim oStream
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 2 ' adTypeText
oStream.Charset = "UTF-8" ' or whatever charset the 3rd party app requires
oStream.WriteText strPost

' skip UTF-8 BOM (see http://stackoverflow.com/questions/4143524)
' If you're using a different charset, you should set Position to 0
oStream.Position = 3

Dim oHttp
Set oHttp = CreateObject("Msxml2.ServerXMLHTTP")
oHttp.open "POST", "http://example.com/", False

oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.send oStream
'oHttp.send strPost
oStream.Close

答案 1 :(得分:0)

看来这是经典ASP的限制,无法避免。将相同的代码移植到C#,我们发现Content-type是按字母顺序接收的,但不是ASP。