在使用 URL 重写隐藏响应标头时无法打开导出 excel 文件

时间:2021-03-22 10:00:37

标签: asp.net iis url-rewriting httpresponse

我有一个导出到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
%>

我可以正常下载报告,但为了减轻安全漏洞,我在 IIS 中使用 URL 重写 隐藏了 server nameasp.net version 等响应标头在我的 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>

问题是添加规则来阻止响应头会导致 excel 文件在下载时无法打开。它抛出一个错误,这让我想知道是否有任何其他方法可以在不干扰导出过程的情况下阻止响应标头。

2 个答案:

答案 0 :(得分:1)

禁用 url 重写后可以打开 Excel 文件吗?如果你想在不使用url rewrite的情况下阻止响应头,你可以尝试以下两种方法。

  1. 使用注册表项。

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

    HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
    

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

  2. 使用 URLScan 工具。

    在您的机器上安装 URLScan。请点击以下链接:

    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,但要删除 Server 标头,请将值更改为 1。

答案 1 :(得分:0)

好的,所以我能够阻止除服务器之外的所有响应标头,我将分享到目前为止对我有用的内容:

X-AspNet-版本:

只需将属性 enableVersionHeader="false" 添加到 <httpRuntime/>。它应该如下所示:

<system.web>
  <httpRuntime enableVersionHeader="false" />
</system.web>

X-Powered-By:

  1. 打开 IIS
  2. 选择 Sites 文件夹下的 Sitename
  3. IIS 下选择 HTTP Response Headers response-headers-module
  4. 选择 X-Powered-By 并删除现有值并添加一个空字符串。

X-Powered-By

注意:一旦我能够在此答案中找到阻止服务器标头的方法,我将进行更新。