使用 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 nameasp.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,你可以尝试以下两种方法。

  1. 使用注册表项。

    在以下注册表项中创建一个名为 DisableServerHeader 的双字条目,并将值设置为 1。

    HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
    

    添加注册表项后,使用net stop http 命令和net start http 命令重新启动HTTP 服务。如果 HTTP 服务没有启动,则使用 iisreset 命令。如果这也不起作用,那么您可以重新启动服务器。

  2. 使用 URLScan 工具。

    在您的机器上安装 URLScan。为此,请遵循以下 link:

    https://www.microsoft.com/security/blog/2013/01/22/microsofts-free-security-tools-urlscan-security-tool/

    安装 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:

  1. 打开 IIS
  2. Select Sites 文件夹下的 网站名
  3. Select HTTP 响应 HeadersIIS
  4. Select X-Powered-By 并删除现有值并添加一个空字符串。

注意:一旦我能够找到阻止服务器 headers 的方法,我将更新此答案。