요청 필터링 규칙 <필터링Rules>

개요

요소는 <filteringRules> 사용자 지정 요청 필터링 규칙의 컬렉션을 지정합니다. 이 요소를 사용하면 관리자가 요청 필터링 기능의 기본 기능을 확장하는 서버에 대한 사용자 지정된 필터링 규칙을 만들 수 있습니다.

<filteringRule> 요소는 사용자 정의 조건에 따라 요청 필터링 동작을 정의하는 사용자 지정 특성 및 요소의 컬렉션을 지정합니다. 예를 들어 각 요청 필터링 규칙에는 다음 특성이 포함될 수 있습니다.

  • denyUnescapedPercent - 이 특성은 요청 필터링이 이스케이프되지 않은 백분율 기호를 포함하는 경우 요청을 거부해야 하는지 여부를 지정합니다.
  • scanAllRaw - 이 특성은 요청 필터링이 요소에 지정된 denyStrings 문자열에 대한 원시 헤더를 검색해야 하는지 여부를 지정합니다.
  • scanQueryString - 이 특성은 요청 필터링이 요소에 지정된 denyStrings 문자열에 대한 쿼리 문자열을 검색해야 하는지 여부를 지정합니다. 요소의 unescapeQueryString<requestFiltering> 특성이 true로 설정된 경우 두 번의 검색이 쿼리 문자열로 이루어집니다. 하나는 원시 쿼리 문자열을 사용하는 검사이고 두 번째 검사는 쿼리 문자열이 캡슐화되지 않은 검사입니다.
  • scanUrl - 이 특성은 요청 필터링이 요소에 지정된 denyStrings 문자열의 URL을 검색해야 하는지 여부를 지정합니다.

또한 각 요청 필터링 규칙에는 다음 자식 요소가 포함될 수 있습니다.

  • <appliesTo> - 요청 필터링 규칙이 적용되는 파일 이름 확장명 목록을 지정합니다.

    참고

    이 섹션이 비어 있으면 규칙이 모든 요청에 적용됩니다.

  • <denyStrings> - 요청 필터링 규칙에 대해 거부할 문자열 목록을 지정합니다.

  • <scanHeaders> - 검사할 HTTP 헤더 목록을 지정합니다.

참고

필터링 규칙으로 인해 요청 필터링이 HTTP 요청을 차단하는 경우 IIS 7은 클라이언트에 HTTP 404 오류를 반환하고 요청이 거부된 이유를 식별하는 고유한 하위 통계를 사용하여 다음 HTTP 상태 기록합니다.

HTTP 하위 상태 Description
404.19 규칙을 필터링하여 거부됨

이 하위 통계를 사용하면 웹 관리자가 IIS 로그를 분석하고 잠재적 위협을 식별할 수 있습니다.

호환성

버전 참고
IIS 10.0 <filteringRules> 요소가 IIS 10.0에서 수정되지 않았습니다.
IIS 8.5 <filteringRules> 요소가 IIS 8.5에서 수정되지 않았습니다.
IIS 8.0 <filteringRules> 요소가 IIS 8.0에서 수정되지 않았습니다.
IIS 7.5 <filteringRules> 요소의 <requestFiltering> 요소는 IIS 7.5의 기능으로 제공됩니다.
IIS 7.0 <filteringRules> 요소의 <requestFiltering> 요소는 Microsoft 기술 자료 문서 957508(https://support.microsoft.com/kb/957508)을 통해 사용할 수 있는 IIS 7.0에 대한 업데이트로 도입되었습니다.
IIS 6.0 요소는 <filteringRules> URLScan 3.0에 추가된 RuleList 기능과 거의 유사합니다.

설치 프로그램

IIS 7 이상의 기본 설치에는 요청 필터링 역할 서비스 또는 기능이 포함됩니다. 요청 필터링 역할 서비스 또는 기능이 제거된 경우 다음 단계를 사용하여 다시 설치할 수 있습니다.

Windows Server 2012 또는 Windows Server 2012 R2

  1. 작업 표시줄에서 서버 관리자를 클릭합니다.
  2. 서버 관리자관리 메뉴를 클릭한 다음 역할 및 기능 추가를 클릭합니다.
  3. 역할 및 기능 추가 마법사에서 다음을 클릭합니다. 설치 유형을 선택하고 다음을 클릭합니다. 대상 서버를 선택하고 다음을 클릭합니다.
  4. 서버 역할 페이지에서 웹 서버(IIS)를 확장하고, 웹 서버를 확장하고, 보안을 확장한 다음, 필터링 요청을 선택합니다. 다음을 클릭합니다.
    스크린샷은 요청 필터링이 선택된 웹 서버 및 보안 창이 확장된 것을 보여줍니다. .
  5. 기능 선택 페이지에서 다음을 클릭합니다.
  6. 설치 선택 확인 페이지에서 설치를 클릭합니다.
  7. Results(결과) 페이지에서 Close(닫기)를 클릭합니다.

Windows 8 또는 Windows 8.1

  1. 시작 화면에서 포인터를 왼쪽 아래 모서리로 이동하고 시작 단추를 마우스 오른쪽 단추로 클릭한 다음 제어판 클릭합니다.
  2. 제어판프로그램 및 기능을 클릭한 다음 Windows 기능 켜기 또는 끄기를 클릭합니다.
  3. 인터넷 정보 서비스를 확장하고, World Wide Web Services를 확장하고, 보안을 확장한 다음, 필터링 요청을 선택합니다.
    요청 필터링이 강조 표시된 World Wide Web Services 및 보안 창의 스크린샷
  4. 확인을 클릭합니다.
  5. 닫기를 클릭합니다.

Windows Server 2008 또는 Windows Server 2008 R2

  1. 작업 표시줄에서 시작을 클릭하고 관리 도구를 가리킨 다음 서버 관리자 클릭합니다.
  2. 서버 관리자 계층 구조 창에서 역할을 확장한 다음 웹 서버(IIS)를 클릭합니다.
  3. 웹 서버(IIS) 창에서 Role Services 섹션으로 스크롤한 다음 역할 서비스 추가를 클릭합니다.
  4. 역할 서비스 추가 마법사역할 서비스 선택 페이지에서 필터링 요청을 선택하고 다음을 클릭합니다.
    스크린샷은 보안 창이 확장되고 요청 필터링이 선택된 역할 서비스 추가 마법사의 역할 서비스 선택 페이지를 표시합니다.
  5. 설치 선택 확인 페이지에서 설치를 클릭합니다.
  6. Results(결과) 페이지에서 Close(닫기)를 클릭합니다.

Windows Vista 또는 Windows 7

  1. 작업 표시줄에서 시작을 클릭한 다음 제어판 클릭합니다.
  2. 제어판프로그램 및 기능을 클릭한 다음 Windows 기능 켜기 또는 끄기를 클릭합니다.
  3. 인터넷 정보 서비스, World Wide Web Services, 보안을 차례로 확장합니다.
  4. 요청 필터링을 선택한 다음 확인을 클릭합니다.
    스크린샷은 Windows 기능 켜기 또는 끄기 및 선택한 요청 필터링에서 확장된 보안 노드를 표시합니다.

방법

요청 필터링 규칙을 추가하는 방법

  1. IIS(인터넷 정보 서비스) 관리자를 엽니다.

    • Windows Server 2012 또는 Windows Server 2012 R2를 사용하는 경우:

      • 작업 표시줄에서 서버 관리자 클릭하고 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows 8 또는 Windows 8.1 사용하는 경우:

      • Windows 키를 누른 채로 문자 X를 누른 다음 제어판 클릭합니다.
      • 관리 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
    • Windows Server 2008 또는 Windows Server 2008 R2를 사용하는 경우:

      • 작업 표시줄에서 시작을 클릭하고 관리 도구를 가리킨 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows Vista 또는 Windows 7을 사용하는 경우:

      • 작업 표시줄에서 시작을 클릭한 다음 제어판 클릭합니다.
      • 관리 도구를 두 번 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
  2. 연결 창에서 요청 필터링을 구성할 사이트, 애플리케이션 또는 디렉터리로 이동합니다.

  3. 창에서 요청 필터링을 두 번 클릭합니다.

  4. 요청 필터링 창에서 규칙 탭을 클릭합니다.
    규칙 탭을 보여 주는 요청 필터링 창의 스크린샷. 필터링 규칙 추가 옵션이 작업 창에 표시됩니다.

  5. 작업 창에서 필터링 규칙 추가를 클릭합니다.

  6. 필터링 규칙 추가 대화 상자에서 필터링 규칙에 대한 다음 정보를 입력합니다.

    • 이름 필드에 필터링 규칙의 이름을 입력합니다.
    • 필터링 규칙이 요청에 대한 URL 스텁을 검색하려면 URL 검사를 선택합니다.
    • 필터링 규칙이 요청에 대한 쿼리 문자열 을 검색하려면 쿼리 문자열 검사를 선택합니다.
    • Scan Headers 컬렉션에서 검색할 HTTP 헤더를 입력합니다.
    • 적용 대상 컬렉션에서 필터링 규칙과 함께 사용할 파일 이름 확장명을 입력 합니다 .
    • Deny Strings 컬렉션에서 필터링 규칙에 대해 거부할 문자열 컬렉션을 입력 합니다 .
      스크린샷은 이름 필드가 있는 필터링 규칙 추가 대화 상자, l인 검사 및 쿼리 문자열 검사 상자가 모두 선택된 것을 보여줍니다.
  7. 확인을 클릭하여 필터링 규칙 추가 대화 상자를 닫습니다.

구성

<filteringRules> 요소의 <requestFiltering> 요소는 사이트, 애플리케이션 또는 디렉터리 수준에서 구성됩니다.

특성

없음

자식 요소

요소 Description
filteringRule 선택적 요소입니다.

사용자 지정 요청 필터링 규칙의 컬렉션에 규칙을 추가합니다.

구성 샘플

다음 샘플에서는 , <appliesTo><scanHeaders> 요소를 사용하여 <denyStrings>특정 사용자 에이전트에 대한 이미지 도용(거머리)을 방지하는 요청 필터링 규칙을 정의하는 요소를 표시 <requestFiltering> 합니다.

<requestFiltering>
   <filteringRules>
      <filteringRule name="Block Image Leeching" scanUrl="false" scanQueryString="false" scanAllRaw="false">
         <scanHeaders>
            <add requestHeader="User-agent" />
         </scanHeaders>
         <appliesTo>
            <add fileExtension=".gif" />
            <add fileExtension=".jpg" />
            <add fileExtension=".png" />
         </appliesTo>
         <denyStrings>
            <add string="leech-bot" />
         </denyStrings>
      </filteringRule>
   </filteringRules>
</requestFiltering>

다음 샘플에서는 SQL 삽입 공격에 자주 사용되는 쿼리 문자열의 텍스트 문자열 컬렉션을 거부하여 SQL 삽입 공격을 방지하는 요청 필터링 규칙을 정의하는 요소를 표시 <requestFiltering> 합니다.

<requestFiltering>
   <filteringRules>
      <filteringRule name="SQLInjection" scanUrl="false" scanQueryString="true">
         <appliesTo>
            <clear />
            <add fileExtension=".asp" />
            <add fileExtension=".aspx" />
            <add fileExtension=".php" />
         </appliesTo>
         <denyStrings>
            <clear />
            <add string="--" />
            <add string=";" />
            <add string="/*" />
            <add string="@" />
            <add string="char" />
            <add string="alter" />
            <add string="begin" />
            <add string="cast" />
            <add string="create" />
            <add string="cursor" />
            <add string="declare" />
            <add string="delete" />
            <add string="drop" />
            <add string="end" />
            <add string="exec" />
            <add string="fetch" />
            <add string="insert" />
            <add string="kill" />
            <add string="open" />
            <add string="select" />
            <add string="sys" />
            <add string="table" />
            <add string="update" />
         </denyStrings>
         <scanHeaders>
            <clear />
         </scanHeaders>
      </filteringRule>
   </filteringRules>
</requestFiltering>

샘플 코드

다음 예제에서는 , 및 <appliesTo><scanHeaders> 요소를 사용하여 <denyStrings>특정 사용자 에이전트에 대한 이미지 도용(거머리)을 방지하는 기본 웹 사이트에 대한 요청 필터링 규칙을 추가하는 방법을 보여 줍니다. 이 예제의 시나리오는 다음과 같습니다. 웹 사이트의 이미지가 특정 사용자 에이전트에 의해 거머리를 치는 것을 감지한 경우 해당 특정 사용자 에이전트에 대한 이미지 파일에 대한 액세스를 거부하는 요청 필터링 규칙을 만들 수 있습니다. 이 특정 예제에서 요청 필터링 규칙은 HTTP 사용자 에이전트 헤더에서 문자열 "거머리 봇"을 검색하고 사용자 에이전트 헤더에 검색 문자열이 포함된 경우 GIF, JPG 및 PNG 파일에 대한 액세스를 거부합니다.

AppCmd.exe

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching',scanUrl='False',scanQueryString='False',scanAllRaw='False']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching'].scanHeaders.[requestHeader='User-agent']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching'].appliesTo.[fileExtension='.gif']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching'].appliesTo.[fileExtension='.jpg']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching'].appliesTo.[fileExtension='.png']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='Block Image Leeching'].denyStrings.[string='leech-bot']"

PowerShell

Start-IISCommitDelay

$filteringRules = Get-IISConfigSection -CommitPath 'Default Web Site' -SectionPath 'system.webServer/security/requestFiltering' | Get-IISConfigCollection -CollectionName 'filteringRules' 
New-IISConfigCollectionElement -ConfigCollection $filteringRules -ConfigAttribute @{ 'name' = 'Block Image Leeching'; 'scanUrl' = $false; 'scanQueryString' = $false; 'scanAllRaw' = $false; } 

$Rule = Get-IISConfigCollectionElement -ConfigCollection $filteringRules -ConfigAttribute @{ 'name' = 'Block Image Leeching' }

$ruleScanHeaders = Get-IISConfigCollection -ConfigElement $Rule -CollectionName 'scanHeaders' 
New-IISConfigCollectionElement -ConfigCollection $ruleScanHeaders -ConfigAttribute @{ 'requestHeader' = 'User-Agent' }

$ruleAppliesTo = Get-IISConfigCollection -ConfigElement $Rule -CollectionName 'appliesTo'
New-IISConfigCollectionElement -ConfigCollection $ruleAppliesTo -ConfigAttribute @{ 'fileExtension' = '.gif' }
New-IISConfigCollectionElement -ConfigCollection $ruleAppliesTo -ConfigAttribute @{ 'fileExtension' = '.jpg' }
New-IISConfigCollectionElement -ConfigCollection $ruleAppliesTo -ConfigAttribute @{ 'fileExtension' = '.png' }

$ruleDenyStrings = Get-IISConfigCollection -ConfigElement $Rule -CollectionName 'denyStrings'
New-IISConfigCollectionElement -ConfigCollection $ruleDenyStrings -ConfigAttribute @{ 'string' = 'leech-bot' }

Stop-IISCommitDelay

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetWebConfiguration("Default Web Site");
         ConfigurationSection requestFilteringSection = config.GetSection("system.webServer/security/requestFiltering");
         ConfigurationElementCollection filteringRulesCollection = requestFilteringSection.GetCollection("filteringRules");

         ConfigurationElement filteringRuleElement = filteringRulesCollection.CreateElement("filteringRule");
         filteringRuleElement["name"] = @"Block Image Leeching";
         filteringRuleElement["scanUrl"] = false;
         filteringRuleElement["scanQueryString"] = false;
         filteringRuleElement["scanAllRaw"] = false;

         ConfigurationElementCollection scanHeadersCollection = filteringRuleElement.GetCollection("scanHeaders");
         ConfigurationElement addElement = scanHeadersCollection.CreateElement("add");
         addElement["requestHeader"] = @"User-agent";
         scanHeadersCollection.Add(addElement);

         ConfigurationElementCollection appliesToCollection = filteringRuleElement.GetCollection("appliesTo");
         ConfigurationElement addElement1 = appliesToCollection.CreateElement("add");
         addElement1["fileExtension"] = @".gif";
         appliesToCollection.Add(addElement1);
         ConfigurationElement addElement2 = appliesToCollection.CreateElement("add");
         addElement2["fileExtension"] = @".jpg";
         appliesToCollection.Add(addElement2);
         ConfigurationElement addElement3 = appliesToCollection.CreateElement("add");
         addElement3["fileExtension"] = @".png";
         appliesToCollection.Add(addElement3);

         ConfigurationElementCollection denyStringsCollection = filteringRuleElement.GetCollection("denyStrings");
         ConfigurationElement addElement4 = denyStringsCollection.CreateElement("add");
         addElement4["string"] = @"leech-bot";
         denyStringsCollection.Add(addElement4);

         filteringRulesCollection.Add(filteringRuleElement);
         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration


Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
      Dim requestFilteringSection As ConfigurationSection = config.GetSection("system.webServer/security/requestFiltering")
      Dim filteringRulesCollection As ConfigurationElementCollection = requestFilteringSection.GetCollection("filteringRules")

      Dim filteringRuleElement As ConfigurationElement = filteringRulesCollection.CreateElement("filteringRule")
      filteringRuleElement("name") = "Block Image Leeching"
      filteringRuleElement("scanUrl") = False
      filteringRuleElement("scanQueryString") = False
      filteringRuleElement("scanAllRaw") = False

      Dim scanHeadersCollection As ConfigurationElementCollection = filteringRuleElement.GetCollection("scanHeaders")
      Dim addElement As ConfigurationElement = scanHeadersCollection.CreateElement("add")
      addElement("requestHeader") = "User-agent"
      scanHeadersCollection.Add(addElement)

      Dim appliesToCollection As ConfigurationElementCollection = filteringRuleElement.GetCollection("appliesTo")
      Dim addElement1 As ConfigurationElement = appliesToCollection.CreateElement("add")
      addElement1("fileExtension") = ".gif"
      appliesToCollection.Add(addElement1)
      Dim addElement2 As ConfigurationElement = appliesToCollection.CreateElement("add")
      addElement2("fileExtension") = ".jpg"
      appliesToCollection.Add(addElement2)
      Dim addElement3 As ConfigurationElement = appliesToCollection.CreateElement("add")
      addElement3("fileExtension") = ".png"
      appliesToCollection.Add(addElement3)

      Dim denyStringsCollection As ConfigurationElementCollection = filteringRuleElement.GetCollection("denyStrings")
      Dim addElement4 As ConfigurationElement = denyStringsCollection.CreateElement("add")
      addElement4("string") = "leech-bot"
      denyStringsCollection.Add(addElement4)

      filteringRulesCollection.Add(filteringRuleElement)
      serverManager.CommitChanges()
   End Sub
End Module

JavaScript

adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var filteringRulesCollection = requestFilteringSection.ChildElements.Item("filteringRules").Collection;

var filteringRuleElement = filteringRulesCollection.CreateNewElement("filteringRule");
filteringRuleElement.Properties.Item("name").Value = "Block Image Leeching";
filteringRuleElement.Properties.Item("scanUrl").Value = false;
filteringRuleElement.Properties.Item("scanQueryString").Value = false;
filteringRuleElement.Properties.Item("scanAllRaw").Value = false;

var scanHeadersCollection = filteringRuleElement.ChildElements.Item("scanHeaders").Collection;
var addElement = scanHeadersCollection.CreateNewElement("add");
addElement.Properties.Item("requestHeader").Value = "User-agent";
scanHeadersCollection.AddElement(addElement);

var appliesToCollection = filteringRuleElement.ChildElements.Item("appliesTo").Collection;
var addElement1 = appliesToCollection.CreateNewElement("add");
addElement1.Properties.Item("fileExtension").Value = ".gif";
appliesToCollection.AddElement(addElement1);
var addElement2 = appliesToCollection.CreateNewElement("add");
addElement2.Properties.Item("fileExtension").Value = ".jpg";
appliesToCollection.AddElement(addElement2);
var addElement3 = appliesToCollection.CreateNewElement("add");
addElement3.Properties.Item("fileExtension").Value = ".png";
appliesToCollection.AddElement(addElement3);

var denyStringsCollection = filteringRuleElement.ChildElements.Item("denyStrings").Collection;
var addElement4 = denyStringsCollection.CreateNewElement("add");
addElement4.Properties.Item("string").Value = "leech-bot";
denyStringsCollection.AddElement(addElement4);

filteringRulesCollection.AddElement(filteringRuleElement);
adminManager.CommitChanges();

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set filteringRulesCollection = requestFilteringSection.ChildElements.Item("filteringRules").Collection

Set filteringRuleElement = filteringRulesCollection.CreateNewElement("filteringRule")
filteringRuleElement.Properties.Item("name").Value = "Block Image Leeching"
filteringRuleElement.Properties.Item("scanUrl").Value = False
filteringRuleElement.Properties.Item("scanQueryString").Value = False
filteringRuleElement.Properties.Item("scanAllRaw").Value = False

Set scanHeadersCollection = filteringRuleElement.ChildElements.Item("scanHeaders").Collection
Set addElement = scanHeadersCollection.CreateNewElement("add")
addElement.Properties.Item("requestHeader").Value = "User-agent"
scanHeadersCollection.AddElement(addElement)

Set appliesToCollection = filteringRuleElement.ChildElements.Item("appliesTo").Collection
Set addElement1 = appliesToCollection.CreateNewElement("add")
addElement1.Properties.Item("fileExtension").Value = ".gif"
appliesToCollection.AddElement(addElement1)
Set addElement2 = appliesToCollection.CreateNewElement("add")
addElement2.Properties.Item("fileExtension").Value = ".jpg"
appliesToCollection.AddElement(addElement2)
Set addElement3 = appliesToCollection.CreateNewElement("add")
addElement3.Properties.Item("fileExtension").Value = ".png"
appliesToCollection.AddElement(addElement3)

Set denyStringsCollection = filteringRuleElement.ChildElements.Item("denyStrings").Collection
Set addElement4 = denyStringsCollection.CreateNewElement("add")
addElement4.Properties.Item("string").Value = "leech-bot"
denyStringsCollection.AddElement(addElement4)

filteringRulesCollection.AddElement(filteringRuleElement)
adminManager.CommitChanges()