2017-03-23 2 views
0

Ich fand die folgende Funktion zu analysieren und URL-Parameter verwendet wird, in Legacy-ASP-Validierung:Sichere URL-Parameter-Validierung in der ASP

FOR EACH field IN Request.QueryString 
     var_name = field 
     var_value = Request.QueryString(field) 
     var_value = Replace(var_value, "'", "'") 
     var_value = Replace(var_value,"""",""") 
     var_value = Replace(var_value, "&", "&") 
     var_value = Replace(var_value, "%", "%") 
     str = "Dim " & var_name 
     EXECUTE(str) 
     str = var_name & " = var_value" 
     EXECUTE(str) 
    NEXT 

Das macht keinen Sinn für mich machen, und diese beiden EXECUTE Aussagen zu sein scheinen um einen Injektionsangriff betteln (obwohl ich noch nicht die Zeit genommen habe, einen zu konstruieren).

Gibt es eine kanonische und sichere Methode zum Parsen einer Abfragezeichenfolge für ASP Classic?

+0

Sie versuchen, gefährliche Zeichen in der Abfragezeichenfolge zu codieren. Das EXECUTE sieht beängstigend aus. Ich bin kein klassischer ASP-Programmierer, aber die Art, wie ich den geschriebenen Code erwarten würde, besteht darin, die Abfrageparameter zu durchlaufen und zu überprüfen, dass die Schlüssel/Wert-Paare nur Zeichen in {a-z, A-Z, 0-9} enthalten. – TheGreatContini

+0

@TheGreatContini - Ich sollte hinzufügen, dass ich nicht (ich glaube nicht) eine Zeichen-Whitelist verwenden kann, weil ich mehrsprachige Parameter unterstützen muss. Auch, weil dies getan wurde, bedeutet es nicht, dass es korrekt oder notwendig war. Soweit ich weiß, codiert IIS die Dinge bereits korrekt .... – feetwet

Antwort

1

Anstatt die Werte in lokalen Variablen zu speichern (d. H. Dim) und sich den Sicherheitsanfälligkeiten von execute auszusetzen, können Sie die Werte in einem Dictionary speichern. Sie können die aus der Abfragezeichenfolge entnommenen Werte beim Hinzufügen kodieren, aber hier ist die dünne Version.

set qs = server.createObject("scripting.dictionary") 

for each q in request.querystring 
    if not qs.exists(q) then qs.add q, request.querystring(q) 
next