我得到這個警告,說tmpnam是危險的,但我寧願使用它,因爲它可以在Windows和Linux中一樣使用。我想知道爲什麼它會被認爲是危險的(我猜這是因爲可能存在濫用而非實際工作不正常)。tmpnam警告說這是危險的
回答
從使用tmpnam手冊頁:
的使用tmpnam()函數生成在每次調用,高達TMP_MAX倍時間不同的字符串。如果它被調用的時間超過TMP_MAX,則行爲是實現定義的。
雖然tmpnam()會生成很難猜測的名稱,但tmpnam()返回路徑名的時間與程序打開它的時間之間可能存在差異,但另一個程序可能使用open() 2),或將其創建爲符號鏈接。這可能會導致安全漏洞。爲了避免這種可能性,使用open(2)O_EXCL標誌打開路徑名。或者更好的是,使用mkstemp(3)或tmpfile(3)。
Mktemp確實創建了文件,因此您可以放心使用,而tmpnam會返回一個可能已經存在的名稱。
使用'mktemp'是Unix專用的Windows,您需要'tmpnam_s'和'_wtmpnam_s'。因此,獨立於平臺的版本並不那麼容易。 – usr1234567 2015-04-23 07:56:57
從使用tmpnam(3)手冊頁:
雖然使用tmpnam()生成了難以猜測的名字,但它仍然是可能的是使用tmpnam(時間之間 )返回一個路徑名,和時間程序打開它,另一個程序可能使用open(2)創建該路徑,或者將其創建爲符號鏈接。這可能會導致安全漏洞。爲了避免這種可能性,使用open(2)O_EXCL標誌打開路徑名。或者更好的是,使用mkstemp(3)或tmpfile(3)。
,如果你談論MSVC的編譯器警告:
These functions are deprecated because more secure versions are available;
see tmpnam_s, _wtmpnam_s.
(http://msdn.microsoft.com/de-de/library/hs3e7355(VS.80).aspx)
否則剛剛看了一下聯機手冊說這個功能的缺點。它主要是關於第二個進程創建與您的進程完全相同的文件名。
如果您想在多個平臺上使用相同的符號,請使用宏定義TMPNAM。只要你用相同的接口選擇更安全的功能,你就可以在兩者上使用它。無論如何,你的代碼中都有條件編譯,對吧?
該函數是危險的,因爲您負責分配緩衝區,該緩衝區的大小足以處理tmpnam()
要寫入該緩衝區的字符串。如果分配的緩衝區太小,tmpnam()
無法知道,並且會超出緩衝區(造成嚴重破壞)。 tmpnam_s()
(MS的安全版本)要求你傳遞緩衝區的長度,所以tmpnam_s
知道何時停止。
有一個預處理器常量L_tmpnam指定實現將寫入的最大長度(或者在單線程程序中,可以使用NULL指針,在這種情況下它將使用靜態緩衝區)。因此這是一個容易避免的問題。危險的部分來自創建文件名稱和隨後創建文件本身之間的可能競爭條件。 – janneb 2010-07-21 17:08:00
大多數安全漏洞很容易避免。 (你的答案引用了一種簡單的方法來避免你描述的問題)。如果你不遵守規則,我描述的問題更可能發生。 (這也是tmpnam_s()修復的問題,所以這顯然是他們所考慮的問題) – 2010-07-21 17:27:51
- 1. EVAL()。這是危險的嗎?
- 2. 警告 - 危險使用全局這個對象
- 3. 警告 - 危險使用全局這個對象?
- 4. 這是危險的嗎?關於事件
- 5. 這是很危險的Javascript嗎?
- 6. 這個加入提示是否危險?
- 7. 是jQuery.html()危險嗎?
- 8. 從int到longlong的危險轉換:沒有警告?
- 9. 這對我的Rails應用程序來說很危險嗎?
- 10. 線程數據共享給WAR危險警告
- 11. 警告:使用的tempnam'「是很危險的,更好地利用'mkstemp」
- 12. 忽略警告的危害是什麼?
- 13. git commit --amend是危險的
- 14. 也是$ _REQUEST危險的?
- 15. Ajax的危險
- 16. GET_ACCOUNTS權限是否危險?
- 17. 什麼是... mysql_real_escape_string?危險嗎?
- 18. fb_ca_chain_bundle.crt危險
- 19. 危險的做法?
- 20. 這個SQL查詢有多危險?
- 21. 這會造成WAR危險嗎?
- 22. 這個bash腳本有多危險?
- 23. 任何禁用`tempnam'的方法都很危險,最好使用`mkstemp'gcc警告?
- 24. 是ColdFusion的評估()真的很危險?
- 25. Fortran中的數組邊界檢查 - 這是否危險?
- 26. 沒有涉及服務器的XSS - 這是否危險?
- 27. 這是在Ruby(on Rails)Date.today的危險覆蓋? (時區)
- 28. Unicode輸入危險
- 29. 取儲存危險
- 30. trustMe有多危險?
你可以添加一些上下文嗎?誰聲稱這是危險的? – nmichaels 2010-07-21 13:46:42
tmpname是變量名稱,文件名稱,源文件名稱還是其他名稱?並不是所有人都有心理能力。 – sbi 2010-07-21 13:50:06
@sbi:'tmpnam'是標準C庫函數。 – 2010-07-21 14:13:25