代码之家  ›  专栏  ›  技术社区  ›  Tim

安全编程中的Memcpy()?

  •  13
  • Tim  · 技术社区  · 15 年前

    an article memcpy() 在其安全编程商店中运行。我理解函数中固有的漏洞,但是否有必要完全禁止其使用?

    我写的程序应该避免吗

    10 回复  |  直到 15 年前
        1
  •  31
  •   Thomas L Holaday    9 年前

    微软提供 alternatives 发送到验证其参数的memcpy和wmemcpy。

    memcpy_说,“嗯,在我读这个地址之前,让我自己验证一下它不是空指针;在我写信给这个地址之前,我将再次进行测试。我还将比较请求复制的字节数与目标的声明大小;如果且仅当呼叫通过所有这些测试,我才能执行副本。”

    memcpy说“将目的地填入寄存器,将源填入寄存器,将计数填入寄存器,执行MOVSB或MOVSW。”(关于geocities的例子,不长于这个世界: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html )

    你的愿望是我的命令 MeMcPy的方法,考虑OpenSalARIS,其中MeMCPY是(对于某些配置) defined in terms of bcopy bcopy (对于某些配置)是。。。

    void
         33 bcopy(from, to, count)
         34 #ifdef vax
         35     unsigned char *from, *to;
         36     int count;
         37 {
         38 
         39     asm("   movc3   12(ap),*4(ap),*8(ap)");
         40 }
         41 #else
         42 #ifdef u3b      /* movblkb only works with register args */
         43     unsigned char *from, *to;
         44     int count;
         45 {
         46     asm("   movblkb %r6, %r8, %r7");
         47 }
         48 #else
         49     unsigned char *from, *to;
         50     int count;
         51 {
         52     while ((count--) > 0)
         53         *to++ = *from++;
         54 }
         55 #endif
    

    编辑:谢谢,米莉·史密斯!以下是我在上面链接的geocities页面上的内容:

    莫夫斯

    指令movs用于将源字符串复制到目标中(是,复制,不移动)。此指令有两种变体:movsb和movsw。movsb(“移动字符串字节”)一次移动一个字节,而movsw一次移动两个字节。

    因为我们希望一次移动几个字节,所以这些movs指令是使用rep前缀成批执行的。移动次数由CX寄存器指定。请参见下面的示例:

    :
    lds   si, [src]
    les   di, [dest]
    cld
    mov   cx, 100
    rep   movsb
    :
    

    此示例将从src复制100字节到dest。如果将movsb替换为movsw,则会复制200字节。如果删除rep前缀,CX寄存器将无效。您将移动一个字节(如果是movsb,则移动一个字节;如果是movsw,则移动两个字节)。

        2
  •  9
  •   MSalters    15 年前

    不用麻烦了。微软的替代品也没那么好。主要的价值在于,这会导致您的代码无法移植到Linux。微软在他们卖给你的客户的操作系统上赚的钱比他们在你购买的Visual C++的拷贝上赚的钱多。

        3
  •  8
  •   0x6adb015    15 年前

    如果使用得当,电锯是安全的。memcpy()也是如此。但在这两种情况下,如果你碰到钉子,它会飞起来伤害你。

    简而言之,memcpy()对于低级计算是必需的,不会消失,但是对于高级编程您不需要它。Python中没有memcpy()。

        4
  •  6
  •   TrayMan    15 年前

    本文本身描述了一个更安全的替代方案:memcpy_,它要求您指定目标的最大长度。当提供的数字与要复制的字节数无关时,它将充当屏障,以防止缓冲区溢出。当然,你可以通过给这两个数字相同来滥用它。

        5
  •  3
  •   merkuro    15 年前

    在代码中禁用memcpy()是让我成为更好的程序员,让我的应用程序更安全还是更不兼容?我不确定MS是否真的想更改任何东西,或者只是使任何新的C代码与其他编译器不兼容。顺便说一句,微软在很多功能上都有这种把戏,这很烦人。strcpy->strcpy_s->StringCchCopy。

        6
  •  2
  •   Anton Kazennikov    15 年前

    我认为C应该留给程序员一个选择,让他自己动手。 如果操作正确,手动内存管理是安全的。

        7
  •  2
  •   user172783 user172783    15 年前

    你自己也这么说:“微软在其网站上禁止使用memcpy()函数 安全编程商店 ,我理解 功能中固有的漏洞

    众所周知,memcpy()和大量其他标准函数都会导致漏洞,那么,当(尽管是增量的)改进微不足道时,为什么安全编程商店会允许使用它们呢?

    毫无疑问,在他们努力提高自己产品的安全性的过程中,代码审查清楚地表明,这些函数对很大一部分漏洞、缓冲区溢出等负有责任。他们将包装器引入标准库,并添加了编译器警告,而不是仅用于内部使用(不是禁令)为了所有人的利益。

        8
  •  -1
  •   Sean    15 年前

    另一种选择是打电话 memcpy_s

        9
  •  -1
  •   mseebeck    7 年前

    如果您使用的是旧版本,如C99或C++98,或者在Solaris上,则不能使用memcpy_s,除非您安装了安全的C库。

    memcpy_s()是一个特定于Microsoft的实现,根据其自身的标准,在C11之前的非MS实现(包括ANSI)上不存在。

    我将把支持MS和反对MS的东西放在一边,因为这无关紧要。

    memmove()是一个更好的解决方案,因为它解决了重叠问题。memmove_s()更健壮,但同样,只有在使用C11或更高版本时才更健壮。

        10
  •  -2
  •   Jem    15 年前

    您应该改为使用memcpy_s()。对于被认为不安全的各种其他功能,也存在相同的版本。