关于Microsoft的字符串安全功能

时间:2010-08-18 23:11:27

标签: windows visual-studio-2008 winapi string

WCHAR* someString = L"SomeString\n";
WCHAR s1[MAX_PATH];

// I'm sure this is right code.
StringCchCopyW(s1, _countof(s1), someString);

// But I'm not sure about these example.
StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right?
StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right?

// How about these?
StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right?
StringCchCatW(s1, _countof(s1), someString); // Is it right?

1 个答案:

答案 0 :(得分:1)

所有功能的一个问题是你忽略了检查返回值。即使字符串安全功能也可能失败,如果他们这样做,他们将默默地在您的代码中。字符串函数的返回值应该始终检查,或者您已经打开安全漏洞。

除此之外,很难用肯定的肯定或否定来解决这个问题,因为有一些微妙的问题需要考虑。让我们按顺序接受它们

StringCchCopyW(s1, _countof(s1), someString);

这是正确的,除了忽略的返回值之外没有任何实际问题。

StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right?

很难回答这个问题。在此操作之后s1+100将指向一个有效的字符串对象,但这对s1没有任何作用。但它没有打开任何安全漏洞。

StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right? 

这是非常错误的。您说明有效字符的数量是MAX_PATH,但是传递的缓冲区有MAX_PATH-100个字符。如果someString足够长,这可能是缓冲区溢出。

StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right?

这是错误的,但并非危险。您报告的是s1的长度实际上小于它的长度。它不会导致溢出,但会阻止添加有效的字符串。

StringCchCatW(s1, _countof(s1), someString); // Is it right?

如果s1中有一个有效的字符串,这是正确的。如果s1中没有有效的字符串,则可能导致函数执行错误。