fputs vs fwrite的安全性

时间:2018-03-17 08:44:42

标签: c unsafe

我正在编写一个必须从文件中找到子字符串的应用程序 将此子字符串写入某个不同的文件。为了写入文件,我使用fputs,但有人告诉我检查更安全的版本以写入文件。

while (fgets(line, MAX_LINE_LEN, fp1) != NULL) {

        if (pname_count < 1) {
            if (strstr(line, p_name)) {
                pname_count++;
                fputs(strstr(line, p_name), fp2);// danger.
                continue;
            }
        }
       //Remaining code

    }

跟随以下两个链接,但没有得到我的答案。

gets() and fputs() are dangerous functions?

fputs dangerous in C

有人可以解释“fputs”在安全方面的漏洞是什么。?

由于fwrite需要将字符数写入文件,这是否会使fwrite比fput更安全?

2 个答案:

答案 0 :(得分:2)

没风险。

只要你的字符串被正确终止,就不会发生任何不好的事情。

然而在这里:

strstr

NULL的结果理论上可能是NULL,因此您可能会尝试写var i = 0; function hello () { document.getElementById('demo').innerHTML += "<li id= '"+ i +"'>hello'" + i +"'</li>"; $('#' + i).addClass('animated bounceInUp'); if (i < 5) { setTimeout(hello, 5000); } i++; } hello(); 来破坏您的程序。

此处没有代码注入的风险。

答案 1 :(得分:2)

我不相信fputs以任何固有的方式是危险的。 我认为that other question被误认为是错误的。

由于明确的计数,您询问fwrite是否比fputs更安全。我不认为我们可以这么说;我相信这会削减两种方式:

  • fputs处理以null结尾的字符串,因此如果您不小心传递了一个未正确终止空字符串的字符串,fputs将会离开结尾,并且会发生奇怪的事情可能会发生。程序员肯定会犯这个错误。

  • 但它偶然会将错误的计数传递给fwrite。特别是,如果您正在编写(您认为是)以空字符结尾的字符串,那么您可能会调用fwrite(str, 1, strlen(str), fp),这显然会出现完全相同的问题。