2016-11-09 3 views
1

In IIS kann ich Anforderungsfilterung basierend auf URL oder Query-String festlegen und dies erlaubt mir, einige bösartige GET-Anfragen zu blockieren, dies funktioniert jedoch nicht gegen Post-Daten.Wie blockieren Sie Anfragen basierend auf Post-Daten?

Beispiel:

Wenn ich gesetzt in meinem web.config

<security> 
    <requestFiltering> 
     <filteringRules> 
      <filteringRule name="Stop spam" scanUrl="false" scanQueryString="true"> 
       <denyStrings> 
        <clear /> 
        <add string="spam" /> 
       </denyStrings> 
       <scanHeaders> 
        <clear /> 
       </scanHeaders> 
       <appliesTo> 
        <clear /> 
       </appliesTo> 
      </filteringRule> 
     </filteringRules> 
    </requestFiltering> 
</security> 

fordert, dass Wort "Spam" in der Abfragezeichenfolge haben, wird blockiert. Ich muss jedoch auch POST-Anfragen blockieren, die dieses Wort enthalten (zum Beispiel aus einem Formular). Kann ich eine Deny-Regel einrichten, die Anfragen basierend auf POST-Daten filtert und ablehnt, und wenn ja, wie mache ich das?

Antwort

0

Es scheint, dass dies nicht in IIS getan werden kann, aber ich habe es geschafft, einen Workaround in der Website selbst zu finden. Addiert man diese zu Global.asax scheint die Arbeit zu tun:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var sr = new System.IO.StreamReader(Request.InputStream); 
    string content = sr.ReadToEnd(); 
    var rule = @"spam"; 
    if 
    (
     Regex.IsMatch(content, rule, RegexOptions.IgnoreCase) || 
     Regex.IsMatch(Request.Url.Query, rule, RegexOptions.IgnoreCase) 
    ) 
    { 
     // TODO: Do some logging here 
     throw new Exception("Get off my lawn!"); 
    } 
} 

Nur ein kleines Heads-up. Benutze das nur, wenn du weißt, was du tust. Dies wird alle Anfragen testen (und dabei Regex verwenden), also wird die Seite langsamer. Es wird auch nicht alle bösartigen Anfragen lösen.

Verwandte Themen