用戶數據是任何類型的輸入(來自 Web 要求或 URL 的數據、Microsoft Windows Forms 應用程式控制件的輸入等等),可能會對程式代碼產生負面影響,因為數據通常直接用來做為參數來呼叫其他程式代碼。 這種情況類似於惡意代碼使用奇怪的參數呼叫你的程式碼,應該採取相同的預防措施。 使用者輸入實際上很難安全,因為沒有堆疊框架可追蹤可能不受信任的數據是否存在。
這些都是最微妙且最難找到的安全性錯誤之一,因為雖然它們存在於看似與安全性無關的程序代碼中,但它們是將不良數據傳遞至其他程式碼的網關。 若要尋找這些錯誤,請遵循任何類型的輸入數據、想像可能值的範圍,並考慮看到此數據的程式代碼是否可以處理所有這些案例。 您可以透過範圍檢查和拒絕程式代碼無法處理的任何輸入來修正這些錯誤。
涉及用戶數據的一些重要考慮包括:
伺服器回應中的任何使用者資料都會在客戶端的伺服器網站上下文中執行。 如果你的網頁伺服器將使用者資料插入回傳的網頁中,例如,可能會包含
<script>標籤,並像從伺服器一樣執行。請記住,用戶端可以要求任何 URL。
請考慮棘手或無效的路徑:
..\ ,極長的路徑。
使用星號 (*) 作為通配符。
令牌擴充(%token%)。
具有特殊意義的奇怪路徑形式。
替代檔案系統資料流名稱,例如
filename::$DATA。檔案名稱的簡短版本,例如將
longfi~1縮寫為longfilename。
請記住,Eval(userdata) 可以執行任何動作。
注意涉及用戶數據的名稱進行延遲綁定。
如果您正在處理 Web 資料,請考慮允許的各種形式逸出,包括:
十六進位轉義序列 (%nn)。
Unicode 轉義序列(%nnn)。
過長的UTF-8轉義符(%nn%nn)。
雙重逸出(%nn 變成 %mmnn,其中 %mm 是 '%' 的逸出。
請謹慎使用可能有多個標準格式的用戶名稱。 例如,您通常可以使用 MYDOMAIN\username 窗體或 username@mydomain.example.com 窗體。