可能存在哪些安全漏洞?或任何攻擊?爲什麼我們不應該在printf語句中傳遞程序的輸入?
回答
緩衝區溢出攻擊。請參閱http://en.wikipedia.org/wiki/Buffer_overflow
printf函數的哪個參數?
printf("%s\n", untrusted_string);
大多數都是正常的,但是如果輸出到達終端,並且終端響應控制代碼,則可能會使終端設置超出所有識別範圍。
顯然,當程序的輸出將被用作可執行代碼時,它也會變得有趣。它可能並不總是顯而易見的。例如,假設您編寫了一個掃描您的Web服務器日誌的程序,並生成列出所有訪問的URL的HTML報告。再假設我訪問http://example/<script>...</script>
。我收到一條錯誤消息,但該URL仍被記錄。如果您未經修改就打印了輸入內容,那麼當您查看報告文件時,您可能需要花費一個教育之夜。用戶輸入需要在線路的某處進行消毒。
迴應用戶提供的數據,支持同一用戶,會更安全一些。然而,在網絡環境下,XSRF攻擊是一種常見的技術 - 您可能會認爲是您的用戶自己編寫輸入,但實際上他們沒有這樣做,所以實際上您會將某些攻擊者的數據回傳給用戶。即使在命令行程序中也是如此 - 如果用戶提供文件作爲命令行參數,但文件(如上面的我的服務器日誌)由攻擊者寫入,則將該文件的一部分重新打印回用戶潛在地具有用戶從未打算的結果。
其中沒有一個是必然不這樣做的原因。與安全一樣,您不能說某個特定行爲是「是」還是「不是」是安全的,因爲它取決於發生該行爲的上下文。
printf(untrusted_string);
絕對不行,因爲提供的字符串可能是「%s」,具有未定義的行爲。你可能會想,「哦,好吧,它只有讀數爲不應該,那可能會造成什麼傷害?」在這種情況下,您最終會加入一大堆人,他們對於多個漏洞的攻擊者表現出的獨創性感到驚訝,以創建可行的攻擊。閱讀不清楚的地方可能會導致DoS,但也可能與其他問題相結合,從而泄露敏感信息。
- 1. 爲什麼我的應用程序不能輸入if語句
- 2. 爲什麼程序不執行最終的printf語句?
- 3. 爲什麼程序沒有進入if語句時它應該
- 4. 爲什麼我的程序進入if語句及其相應的else語句?
- 5. C++我們應該在MurmurHash3參數中傳遞什麼?
- 6. 爲什麼printf在我的程序中輸出這個?
- 7. 爲什麼我們不應該在應用程序庫中放置tomcat庫
- 8. 爲什麼我的if語句不應該被激活?
- 9. 爲什麼這些程序(僅在一個printf語句中有所不同)具有不同的輸出?
- 10. 爲什麼我的程序不能打印我的語句?
- 11. 爲什麼我們不應該在dopost中使用請求調度程序?
- 12. C語言:爲什麼這兩個printf語句輸出不同的東西
- 13. 爲什麼printf語句不能生成本書示例中顯示的輸出?
- 14. 爲什麼我在準備好的語句中得到「只有變量應該通過引用傳遞」
- 15. 爲什麼這個c程序不打印第一個printf語句?
- 16. 爲什麼我們不應該在Java中使用
- 17. 爲什麼我的printf輸出歪?
- 18. 爲什麼我的preg_match_all語句捕獲比它應該更多?
- 19. 爲什麼printf輸出在這個C程序中加倍了?
- 20. 爲什麼我可以在C#中編寫一個通用的catch語句,該語句什麼都不做?
- 21. 我們可以在C語言的printf()函數內使用printf語句嗎
- 22. 爲什麼我不得不在SSH中輸入密碼短語
- 23. 爲什麼我應該在Silverlight應用程序中使用MVVM?
- 24. 爲什麼我們不應該在Jboss中使用自己的線程?
- 25. 我應該在類之間傳遞GUI輸入變量還是重構程序?
- 26. 爲什麼我們不應該在UI層中嵌入業務邏輯?
- 27. 爲什麼我們需要使用// <![CDATA [在@using語句中?
- 28. 爲什麼我應該使用goog.ui.Checkbox而不是常規輸入?
- 29. 爲什麼我不應該使用md5()來輸入密碼?
- 30. 爲什麼printf不能在多線程程序中工作?
感謝您的回覆!但我以某種方式搞砸了這個問題。它說:爲什麼我們不應該在用戶消息>中提供用戶提供的數據 –