2011-11-04 62 views

回答

2

printf函數的哪個參數?

printf("%s\n", untrusted_string);大多數都是正常的,但是如果輸出到達終端,並且終端響應控制代碼,則可能會使終端設置超出所有識別範圍。

顯然,當程序的輸出將被用作可執行代碼時,它也會變得有趣。它可能並不總是顯而易見的。例如,假設您編寫了一個掃描您的Web服務器日誌的程序,並生成列出所有訪問的URL的HTML報告。再假設我訪問http://example/<script>...</script>。我收到一條錯誤消息,但該URL仍被記錄。如果您未經修改就打印了輸入內容,那麼當您查看報告文件時,您可能需要花費一個教育之夜。用戶輸入需要在線路的某處進行消毒。

迴應用戶提供的數據,支持同一用戶,會更安全一些。然而,在網絡環境下,XSRF攻擊是一種常見的技術 - 您可能會認爲是您的用戶自己編寫輸入,但實際上他們沒有這樣做,所以實際上您會將某些攻擊者的數據回傳給用戶。即使在命令行程序中也是如此 - 如果用戶提供文件作爲命令行參數,但文件(如上面的我的服務器日誌)由攻擊者寫入,則將該文件的一部分重新打印回用戶潛在地具有用戶從未打算的結果。

其中沒有一個是必然不這樣做的原因。與安全一樣,您不能說某個特定行爲是「是」還是「不是」是安全的,因爲它取決於發生該行爲的上下文。

printf(untrusted_string);絕對不行,因爲提供的字符串可能是「%s」,具有未定義的行爲。你可能會想,「哦,好吧,它只有讀數爲不應該,那可能會造成什麼傷害?」在這種情況下,您最終會加入一大堆人,他們對於多個漏洞的攻擊者表現出的獨創性感到驚訝,以創建可行的攻擊。閱讀不清楚的地方可能會導致DoS,但也可能與其他問題相結合,從而泄露敏感信息。

+0

感謝您的回覆!但我以某種方式搞砸了這個問題。它說:爲什麼我們不應該在用戶消息>中提供用戶提供的數據 –

相關問題