Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

本文讨论了在面对缓冲区溢出攻击增加的情况下,Strlcpy和Strlcat如何作为更安全的字符串处理函数替代标准库中的函数。这两个函数保证了目标字符串始终以NULL结束,并且通过返回值提供了是否发生截断的检查,简化了编程并提高了代码安全性。然而,它们的正确使用仍存在一些误解,如参数处理和性能影响。文章通过实例展示了如何使用Strlcpy和Strlcat避免潜在的缓冲区溢出问题。
摘要由CSDN通过智能技术生成

概述

随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy()strncat() 。尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的。本文介绍另一种直观的,一致的,天生安全的字符串拷贝API

当函数 strncpy()strncat()作为 strcpy()strcat()的安全版本来使用时,仍然存在一些安全隐患。

  1. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆。
  2. 发生字符串截断时,也不容易检查。
  3. strncpy()函数使用0 来填充剩余的目标字符串空间,以招致性能下降。在所有这些问题之中,由长度参数引起的混淆以及与NUL 结束符相关的问题最严重。在审核OpenBSD源代码树的潜在安全漏洞时,我们发现strncpy()strncat()猖獗误用的情况。尽管并非所有的误用都会导致可被利用的安全漏洞,但清楚地表明使用strncpy()strncat() 来实施安全的字符串操作这一准则已普遍受到误解。两个替代函数strlcpy()strlcat() 被提议通过提出一个字符串拷贝安全的API 来解决这些问题(参阅图1 函数原型)。这两函数保证产生包含NUL 的字符串,以长度即字符串按占用字节的数量作为入口参数,并且提供简便的方式来检查是否有字符串截断。两者均不会清零未使用的目标空间。

引言

1996 年年中,笔者和OpenBSD项目的其它成员一起担任审核OpenBSD 源代码树的工作,以寻找安全问题,并强调缓冲区溢出问题。缓冲区溢出问题最近在论坛上获得广泛的关注,并且也被广泛利用。我们发现大量的溢出是由于使用sprintf()strcpy()strcat() 而造成无长度界限的字符串拷贝,在循环里操纵字符串时没有显式检查字符串长度也是元凶之一。除此之外,我们也发现在很多场合下,程序员已使用strncpy()strncat() 进行安全的字符串操纵,但未能领会这些API 的精妙之处。

因此在审核代码时,我们发现不仅有必要去检查是否使用不安全的函数,如strcpy()strcat() ,同时也要检查是是否有函数strncpy()strncat() 的不正确使用。检查是否正确使用并非总是显而易见,特别是使用“静态”变量或使用由malloc() 分配的缓冲区时,这些缓冲区总是预先就填满了NUL 结束符。我们得到一个结论:需要十分安全的函数来替代strncpy()strncat() ,从根本上简化程序员的工作,同时也使代码审核变得更容易。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值