丰田哲学 / 基本操作模板 / sprintf为什么有安全隐患

分享

   

sprintf为什么有安全隐患

2017-05-03  丰田哲学

先来看一小段代码

[plain] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     char buf[12] = {0};  
  6.     char *str = "ab";  
  7.     sprintf(buf, "hello :%s\n", str);  
  8.     printf("%s\n", buf);  
  9.     return 0;  
  10. }  

编译并运行以上程序,会打印输出

[plain] view plain copy
  1. hello :ab  

然而,当把程序改成

[plain] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     char buf[12] = {0};  
  6.     char *str = "abcdefgh";  
  7.     sprintf(buf, "hello :%s\n", str);  
  8.     printf("%s\n", buf);  
  9.     return 0;  
  10. }  

再编译运行,程序可以正常编译,但是当运行程序时,程序就会终止,并报错

[plain] view plain copy
  1. Abort trap: 6  
说明sprintf函数是存在安全隐患的,可能当编写程序时,str变量可能会保存不同的内容,而且有很大可能出现上述安全隐患,

因此推荐使用sprintf安全改进版snprintf函数。

继续上边的例子

[plain] view plain copy
  1. <pre name="code" class="plain">#include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     char buf[12] = {0};  
  6.     char *str = "abcdefgh";  
  7.     snprintf(buf, sizeof(buf), "hello :%s\n", str);  
  8.     printf("%s\n", buf);  
  9.     return 0;  
  10. }  

对其中的参数做一下说明,第一个为目标字符串,第二个目标字符串的长度,第三个为原串。

安全性体现在哪里呢?第二个参数。

当要存储的字符串长度大于目标字符串长度时,会只保存目标串长度-1长度的字符串,并在末尾补\0字符串结束符。因此无论对str字符串作何处理,当使用snprintf时都能确保程序可以正常运行,从而提高程序的健壮性,不至于崩溃退出。


至于sprintf源代码细节有待进一步研究。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>