如何透過 IIS 的 Request Filtering 功能限制存取特定檔案或附檔名

同事因為某個專案使用 Share code with Add as Link 的功能,讓 xml 格式的設定檔直接被放在根目錄下,如此一來爬蟲或是知道檔名的人就可以直接在網路上取得檔案內容,而這樣的設定檔一般都是用來存取其他資源的重要敏感資訊,相關資訊外流是非常嚴重的問題

因此希望在不改程式架構的前提下,避免相關內容被直接存取,打算先治標改天再治本

知道檔案路徑後可以直接開啟

  • 機敏資訊馬上就裸奔了

    1xml

安裝 Request Filtering 功能

  • Windows Server 2016

    • 伺服器管理 –> 新增角色及功能

      1manage

    • 在您開始前

      2intro

    • 安裝類型

      3type

    • 伺服器選取項目

      4targetserver

    • 伺服器角色(IIS)

      5iis

      6iis

    • 角色服務

      ![7filter](https://cloud.githubusercontent.com/assets/3851540/25144283/dc66089e-249f-11e7-8b71-35dbf5c37493.png)
      
    • 確認

      8confirm

    • 結果

      9install

      10success

  • Window 7、Windows 10

    • 開啟 Programs and Features

      1win10program

    • 開啟

      2feature

    • Internet Information Services –> World Wide Web Services –> Security –> Request Filtering

      3win10install

Request Filtering 支援的設定

3requestfilter

4filterfunction

  1. File Name Extensions
  2. Rules
  3. Hidden Segments
  4. URL
  5. HTTP Verbs
  6. Headers
  7. Query Strings

可以用來限制檔案存取的功能

  1. File Name Extensions

    • 限制特定附檔名
    • Deny File Extension… –> File name extension

      5Denyfilename

    • 設定後會自動在 web.config 的 system.webServer 區段加上下列內容

      <security>
          <requestFiltering>
              <fileExtensions>
                  <add fileExtension=".xml" allowed="false" />
              </fileExtensions>
          </requestFiltering>
      </security>
      
    • 畫面結果:HTTP Error 404.7 - Not Found

      6filenameresult

  2. Rules

    • 限制特定檔名,附檔名限制加可不加
    • Add Filtering Rule… –> Scan url –> Applies To (這填附檔名) –> Deny Strings (這填檔名)

      7rulesetting

    • 設定後會自動在 web.config 的 system.webServer 區段加上下列內容

      <security>
          <requestFiltering>
              <filteringRules>
                  <filteringRule name="xml" scanUrl="true" scanQueryString="false">
                      <appliesTo>
                          <add fileExtension=".xml" />
                      </appliesTo>
                      <denyStrings>
                          <add string="web" />
                      </denyStrings>
                  </filteringRule>
              </filteringRules>
          </requestFiltering>
      </security>
      
    • 畫面結果:HTTP Error 404.19 - Not Found

      8ruleresult

  3. Hidden Segments

    • 限制 URL 上的完整檔名 (檔名+附檔名)
    • Add Hidden Segment… –> Hidden segment

      9hiddenseg

    • 設定後會自動在 web.config 的 system.webServer 區段加上下列內容

      <security>
          <requestFiltering>
              <hiddenSegments>
                  <add segment="web.xml" />
              </hiddenSegments>
          </requestFiltering>
      </security>
      
    • 畫面結果:HTTP Error 404.8 - Not Found

      10hiddenseg

  4. URL

    • 限制 URL 上的完整檔名
    • Deny Sequence… –> URL sequence

      11denysequence

    • 設定後會自動在 web.config 的 system.webServer 區段加上下列內容

      <security>
          <requestFiltering>
              <denyUrlSequences>
                  <add sequence="web.xml" />
              </denyUrlSequences>
          </requestFiltering>
      </security>
      
    • 畫面結果:HTTP Error 404.5 - Not Found

      12sequenceresult

參考資訊

  1. Request Filtering
  2. IIS 7要求篩選規則