[英]iPhone / ios development - best way to check if password is secure enough?
[英]Is strncpy secure for iPhone development?
对于iPhone开发, strncpy()
安全吗?
如果不是,那么建议使用哪种更好的String API以确保安全?
如果您知道strncpy()
的局限性,那就可以了。 我避免使用它是因为我不喜欢它的局限性,它有两个方面:
这意味着如果您编写:
char little[10];
char large[20480];
strncpy(little, sizeof(little), "abcdefghijklmnopqrstuvwxyz");
strncpy(large, sizeof(large), "abcdefghijklmnopqrstuvwxyz");
然后,即使没有发生缓冲区溢出, little
是一个以空字符结尾的字符串,并且大的字符串有20454个空值被复制到其尾端。 两者都很麻烦。
strlcpy()
和strlcat()
在iOS上是否可用; 它们在Mac OS X上。 如果您使用C ++进行编码,则根本不应该使用C字符串,或者仅在系统服务需要使用的最有限的情况下使用C字符串,然后才应该具有使用C ++字符串的Cover函数(内联)。并将somestring.c_str()
值传递给系统服务。
如果在Objective-C中进行编码,则将使用NS *字符串。
因此,如果您使用C语言进行编码,请仅考虑strncpy()
。
我有一篇论文(我并没有主张新颖性,而是从别人那里收集了这个想法):
strcpy()
,则只能安全地使用strcpy()
, strncpy()
, strcat()
和strncat()
之类的函数。重新调用—很快,传递给strncat()
的长度代表什么? (1) )。 strcpy()
类的函数; 您可以使用memmove()
(或memcpy()
)。 (1)长度是考虑到当前字符串后目标缓冲区中的可用空间。 因此,要使用strncat()
,您必须知道字符串在目标字符串中的长度以及可用的总长度,以便您可以让strncat()
跳过字符串的初始段,然后连接一些字符串或所有第二个字符串。 但是,如果您知道这一点,则可以使用:
strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);
这将是“更有效的”,因为它不涉及跳过字符串的前导部分(顺便说一句,如果您要构建带有许多strncat()
或strcat()
操作的长字符串,则可能导致二次行为)。 或者,如果您知道所有大小,则可以使用memmove()
:
size_t copy_length = target_size - curr_target_strlen;
if (copy_length > source_strlen)
copy_length = source_strlen + 1;
memmove(target + curr_target_strlen, source, copy_length);
而且,除非我一时冲动编写的代码出现一个错误,否则可以避免strncat()
大多数问题。 如果您始终使用strncat()
,并且第一个参数指向字符串末尾的null,则它有其用途(并且可以在汇编程序中进行优化。否则,这不是一个好选择-IMNSHO。
指定安全性的含义,无论如何,在iPhone上的strncpy
都与在其他平台上一样安全。
由于您需要strncpy
我想您不是在使用NSString
所以使用它不会出现任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.