簡體   English   中英

當我需要文件路徑時如何使用fopen_s?

[英]How to use fopen_s when I need to ask for a filepath?

我曾經用此代碼使fopen 更安全

fin = fopen(ifp, "r");
fout = fopen(ofp, "w");
if ((fin == NULL)||(fout == NULL))
    printf ("Error opening files");
else {} //action

現在,我移到了Microsoft Visual Studio2013。它要求我使用fopen_s而不是fopen。 除了使用_CRT_SECURE_NO_WARNINGS,還有其他解決方案嗎? 我的意思是,文件路徑輸入(scanf)與fopen_s兼容的事實嗎? 或者只是忘記它並禁用安全警告?

PS:我知道文件路徑輸入可能是不安全的,但是我只需要這樣做,因為在我的任務中已經說明了這一點。

我認為這不會使它更安全。 這只是條件和您應該做什么的良好處理。 大概也應該檢查errno

話雖如此,如果您能夠使用fopen_s ,那么我會使用它。 從MSDN上的“ 安全性增強 ”:

  • 參數驗證。 傳遞給CRT功能的參數在安全功能和功能的許多現有版本中均得到驗證。 這些驗證包括:

    • 檢查傳遞給函數的NULL值。

    • 檢查枚舉值的有效性。

    • 檢查積分值是否在有效范圍內。

    有關更多信息,請參見參數驗證。

  • 開發人員還可以訪問無效參數的處理程序。 當遇到無效參數時,CRT提供了一種使用_set_invalid_parameter_handler函數檢查這些問題的方法,而不是聲明並退出應用程序。

  • 緩沖區大小。 安全函數要求將緩沖區大小傳遞給任何寫入緩沖區的函數。 安全版本在寫入緩沖區之前先驗證緩沖區是否足夠大,有助於避免可能導致惡意代碼執行的危險緩沖區溢出錯誤。 這些函數通常返回errno類型的錯誤代碼,並且如果緩沖區的大小太小,則會調用無效的參數處理程序。 從輸入緩沖區讀取的函數(例如gets)具有安全的版本,要求您指定最大大小。

  • 空終止。 某些可能留下未終止字符串的函數具有安全版本,可確保字符串正確以null終止。

  • 增強的錯誤報告功能。 安全功能返回的錯誤代碼比以前存在的功能具有更多的錯誤信息。 安全功能和許多先前存在的功能現在都設置了errno,並且經常還返回errno代碼類型,以提供更好的錯誤報告。

  • 文件系統安全性。 在默認情況下,安全文件I / O API支持安全文件訪問。

  • Windows安全性。 安全流程API強制執行安全策略,並允許指定ACL。

  • 格式化字符串語法檢查。 例如,在printf格式字符串中使用不正確的類型字段字符來檢測無效的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM