2014-01-26 58 views
2

我寫了一堆web應用程序,並知道如何防止mysql注入等。我正在爲C中的一個項目編寫一個日誌存儲系統,因此我建議確保它是免費的,因爲用戶無法提供像foo\b\b\b這樣的錯誤數據,並試圖用一些破舊類型入侵操作系統。我在網上查找,發現類似的問題在這裏:how to check for the "backspace" character in C在文件系統上驗證用戶輸入

這至少是我想到的,但我知道可能還有其他事情我需要防範。有更多經驗的人能幫助我列出當我使用用戶輸入作爲分層文件命名系統的一部分將文件保存到服務器時需要驗證的事情嗎?

示例文件:/home/webapp/data/{User input}/{Machine-ID}/{hostname}/{tag}其中所有這些字段在提交到我們的日誌存儲系統時都可能「僞造」。

+4

已準備好的語句 –

+0

此退格檢查有什麼樣的威脅? –

+4

不要將編程視爲猜謎遊戲,或者像「把東西扔在牆上,看看有什麼棒」。系統地進行思考。這是你永遠可以獲得健壯的唯一方法。 –

回答

4

而不是檢查不好的字符,把它的頭轉到問題並指定字符。例如。要求{User Input}是由[[:alnum:]_]個字符組成的單個目錄名稱; {Machine-ID}必須由您的喜好等[[:xdigit:]]組成。這可以快速擺脫所有的注入東西。

2

如果你只使用過這些輸入你的程序中的文件名,而你將它們存儲在本地的Linux文件系統,那麼關鍵的看點是:

  • 絕對禁止任何文件名以../開頭或包含/../或以/..結尾。此類文件名可能允許用戶訪問您目錄樹以外的文件。
  • 請注意任何包含/的文件名,因爲這些名稱允許用戶命名子目錄,可能會導致意外後果。

,可能導致麻煩其他的事情包括:

  • 如果不同的語言環境中使用,可能有不同的含義非ASCII字符。
  • 某些ASCII標點符號在處理系統的某些部分中可能具有特殊含義,或者在某些文件系統中可能無效。
  • 系統的某些部分可能區分大小寫,其他部分不區分大小寫。考慮使情況正常化。

如果適用,將每個字段限制爲不會導致任何問題的內容。例如:

  • 機器ID應該可能只包含ASCII低位字母和數字(或者只包含ASCII大寫字母和數字)。
  • 主機名只能由ASCII小寫字母和數字組成,外加-但不包含在初始位置(對非ASCII主機名使用Punycode)。如果這些是完全合格的主機名稱,而不是網絡中的主機名稱,則.也是有效的,但不在初始位置。
  • 所有字段都爲空或包含/或用.(初始.啓動可... - 見上面 - 而將是一個點文件ls默認情況下不顯示或不包含在殼中的圖案*,所以最好避免它們)。

雖然控制字符(如退格符)不直接有害,但它們可能會造成間接危害,因爲如果您在命令行上調查問題,它們可能會導致您犯錯。不要讓他們。