使用 URL 重写隐藏响应 headers 时无法打开导出 excel 文件
Unable to open export excel file on hiding response headers using URL Rewrite
我有一个 导出到 excel 代码如下:
<%
Server.ScriptTimeout = 600
'Security check passed, proceed:
Dim conn, rs, sql, x, outlen
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "exec " & Request.QueryString("sp") & " "
For t = 1 To Request.QueryString("p").Count
'Escape single quotes for SQL:
If t > 1 Then sql = sql & ", "
sql = sql & "'" & Replace(Request.QueryString("p").Item(t), "'", "''") & "'"
Next
conn.CommandTimeout = 600
conn.Open strConnString_CyberAgent_WithProvider
rs.Open sql, conn
'Prepare the response:
Response.Buffer = True
Response.CacheControl = "Private"
Response.Expires = 0
Response.Clear
outlen = 0
'Prepare the message headers (Any subsequent response.writes will fall inside the file!)
Response.AddHeader "Content-Disposition", "attachment; filename=Export.xls"
Response.ContentType = "application/vnd.ms-excel"
'Output headers:
For x = 0 To rs.Fields.Count - 1
If x > 0 Then
Response.Write(chr(9))
outlen = outlen + 1
End If
Response.Write(rs.Fields.Item(x).Name)
outlen = outlen + len(rs.Fields.Item(x).Name)
Next
Response.Write(chr(13) & chr(10))
outlen = outlen + 2
'Loop through records:
Do While Not rs.EOF
For x = 0 To rs.Fields.Count - 1
If x > 0 Then
Response.Write(chr(9))
outlen = outlen + 1
End If
Response.Write(rs.Fields.Item(x).Value)
if not(isnull(rs.Fields.Item(x).Value)) then outlen = outlen + len(rs.Fields.Item(x).Value)
Next
Response.Write(chr(13) & chr(10))
outlen = outlen + 2
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Response.AddHeader "Content-Length", outlen
'Flush the buffer, sending the user the file
Response.Flush
%>
我能够正常下载报告,但为了缓解安全漏洞,我使用 [隐藏响应 headers,如 server name
和 asp.net version
=33=] 通过在我的 web.config
中添加以下内容,在 IIS 中重写
<rewrite>
<outboundRules>
<rule name="Remove Server">
<match serverVariable="RESPONSE_SERVER" pattern=".+" />
<action type="Rewrite" />
</rule>
<rule name="Remove Asp.Net Version">
<match serverVariable="RESPONSE_X-ASPNET-VERSION" pattern=".+" />
<action type="Rewrite" />
</rule>
<rule name="Remove Umbraco Version">
<match serverVariable="RESPONSE_X-UMBRACO-VERSION" pattern=".+" negate="false" />
<action type="Rewrite" />
</rule>
</outboundRules>
</rewrite>
<customHeaders>
<remove name="Server" />
<remove name="X-AspNet-Version" />
<remove name="X-Powered-By" />
</customHeaders>
问题是添加规则以阻止响应 headers 导致 excel 文件在下载时无法打开。它抛出一个错误,这让我想知道是否有任何其他方法可以在不干扰导出过程的情况下阻止响应 headers。
禁用url重写后可以打开Excel个文件吗?而如果你想在不使用urlrewrite的情况下屏蔽响应headers,你可以尝试以下两种方法。
使用注册表项。
在以下注册表项中创建一个名为 DisableServerHeader 的双字条目,并将值设置为 1。
HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
添加注册表项后,使用net stop http 命令和net start http 命令重新启动HTTP 服务。如果 HTTP 服务没有启动,则使用 iisreset 命令。如果这也不起作用,那么您可以重新启动服务器。
使用 URLScan 工具。
在您的机器上安装 URLScan。为此,请遵循以下 link:
安装 URLScan 后,打开通常位于 %WINDIR%\System32\Inetsrv\URLscan 文件夹中的 URLScan.ini 文件。打开后,搜索键 RemoveServerHeader 。默认设置为 0,但要删除服务器 header,请将值更改为 1。
好的,所以我能够阻止除 Server 响应之外的所有响应 headers,我将分享到目前为止对我有用的内容:
X-AspNet-Version :
只需将属性 enableVersionHeader="false"
添加到 <httpRuntime/>
。它应该如下所示:
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
X-Powered-By:
注意:一旦我能够找到阻止服务器 headers 的方法,我将更新此答案。
我有一个 导出到 excel 代码如下:
<%
Server.ScriptTimeout = 600
'Security check passed, proceed:
Dim conn, rs, sql, x, outlen
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "exec " & Request.QueryString("sp") & " "
For t = 1 To Request.QueryString("p").Count
'Escape single quotes for SQL:
If t > 1 Then sql = sql & ", "
sql = sql & "'" & Replace(Request.QueryString("p").Item(t), "'", "''") & "'"
Next
conn.CommandTimeout = 600
conn.Open strConnString_CyberAgent_WithProvider
rs.Open sql, conn
'Prepare the response:
Response.Buffer = True
Response.CacheControl = "Private"
Response.Expires = 0
Response.Clear
outlen = 0
'Prepare the message headers (Any subsequent response.writes will fall inside the file!)
Response.AddHeader "Content-Disposition", "attachment; filename=Export.xls"
Response.ContentType = "application/vnd.ms-excel"
'Output headers:
For x = 0 To rs.Fields.Count - 1
If x > 0 Then
Response.Write(chr(9))
outlen = outlen + 1
End If
Response.Write(rs.Fields.Item(x).Name)
outlen = outlen + len(rs.Fields.Item(x).Name)
Next
Response.Write(chr(13) & chr(10))
outlen = outlen + 2
'Loop through records:
Do While Not rs.EOF
For x = 0 To rs.Fields.Count - 1
If x > 0 Then
Response.Write(chr(9))
outlen = outlen + 1
End If
Response.Write(rs.Fields.Item(x).Value)
if not(isnull(rs.Fields.Item(x).Value)) then outlen = outlen + len(rs.Fields.Item(x).Value)
Next
Response.Write(chr(13) & chr(10))
outlen = outlen + 2
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Response.AddHeader "Content-Length", outlen
'Flush the buffer, sending the user the file
Response.Flush
%>
我能够正常下载报告,但为了缓解安全漏洞,我使用 [隐藏响应 headers,如 server name
和 asp.net version
=33=] 通过在我的 web.config
<rewrite>
<outboundRules>
<rule name="Remove Server">
<match serverVariable="RESPONSE_SERVER" pattern=".+" />
<action type="Rewrite" />
</rule>
<rule name="Remove Asp.Net Version">
<match serverVariable="RESPONSE_X-ASPNET-VERSION" pattern=".+" />
<action type="Rewrite" />
</rule>
<rule name="Remove Umbraco Version">
<match serverVariable="RESPONSE_X-UMBRACO-VERSION" pattern=".+" negate="false" />
<action type="Rewrite" />
</rule>
</outboundRules>
</rewrite>
<customHeaders>
<remove name="Server" />
<remove name="X-AspNet-Version" />
<remove name="X-Powered-By" />
</customHeaders>
问题是添加规则以阻止响应 headers 导致 excel 文件在下载时无法打开。它抛出一个错误,这让我想知道是否有任何其他方法可以在不干扰导出过程的情况下阻止响应 headers。
禁用url重写后可以打开Excel个文件吗?而如果你想在不使用urlrewrite的情况下屏蔽响应headers,你可以尝试以下两种方法。
使用注册表项。
在以下注册表项中创建一个名为 DisableServerHeader 的双字条目,并将值设置为 1。
HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
添加注册表项后,使用net stop http 命令和net start http 命令重新启动HTTP 服务。如果 HTTP 服务没有启动,则使用 iisreset 命令。如果这也不起作用,那么您可以重新启动服务器。
使用 URLScan 工具。
在您的机器上安装 URLScan。为此,请遵循以下 link:
安装 URLScan 后,打开通常位于 %WINDIR%\System32\Inetsrv\URLscan 文件夹中的 URLScan.ini 文件。打开后,搜索键 RemoveServerHeader 。默认设置为 0,但要删除服务器 header,请将值更改为 1。
好的,所以我能够阻止除 Server 响应之外的所有响应 headers,我将分享到目前为止对我有用的内容:
X-AspNet-Version :
只需将属性 enableVersionHeader="false"
添加到 <httpRuntime/>
。它应该如下所示:
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
X-Powered-By:
注意:一旦我能够找到阻止服务器 headers 的方法,我将更新此答案。