2017-03-23 110 views
0

我發現下面的函數解析和驗證URL參數在傳統ASP中使用:安全的URL參數驗證的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 

這是沒有意義的,我和那兩個EXECUTE語句似乎是乞求注射攻擊(雖然我還沒有花時間來構建一個)。

是否有更經典和安全的解析ASP Classic查詢字符串的方法?

+0

他們試圖在查詢字符串中編碼危險字符。 EXECUTE確實看起來很可怕。我不是一個傳統的ASP程序員,但我期望看到編寫的代碼循環遍歷查詢參數,並驗證鍵/值對僅包含{a-z,A-Z,0-9}中的字符。 – TheGreatContini

+0

@TheGreatContini - 我應該補充一點,我不能(我不認爲)使用字符白名單,因爲我必須支持多語言參數。另外,僅僅因爲這樣做並不意味着這是正確的或必要的。據我所知,IIS已經正確地編碼了東西.... – feetwet

回答

1

您可以將值存儲在字典中,而不是將值存儲在局部變量(即Dim)中並將自己暴露於execute的漏洞。您可以在添加它們時對查詢字符串中的值進行編碼,但這裏是瘦身版本。

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