文档章节

get_s等secure functions的使用

zray4u
 zray4u
发布于 2016/07/01 21:08
字数 1661
阅读 9
收藏 0

_s类函数的使用策略

首先介绍下gets_s、getws_s函数的用法。gets_s, _getws_s
https://msdn.microsoft.com/en-us/library/5b5x9wc7.aspx

Gets a line from the stdin stream. These versions of gets, _getws have security enhancements(安全加强), as described in Security Features in the CRT.

char *gets_s(
   char *buffer,
   size_t sizeInCharacters
);
wchar_t *_getws_s(
   wchar_t *buffer,
   size_t sizeInCharacters
);
template <size_t size>
char *gets_s(
   char (&buffer)[size]    //指针的引用类型,可以避免在函数参数传递中数组被退化成指针
); // C++ only
template <size_t size>
wchar_t *_getws_s(
   wchar_t (&buffer)[size]
); // C++ only

Parameters

[out] buffer

Storage location for input string.

[in] sizeInCharacters   note:这里是用字符数表示的尺寸,而非字节数。

The size of the buffer.

Return Value

Returns buffer if successful. A NULL pointer indicates an error or end-of-file condition. Use ferror or feof to determine which one has occurred.   note:返回值可不是接收了多少字符,而是buffer指针。

Remarks

The gets_s function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets_s then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets_s function retains(保留) the newline character.

总结:gets_s在读取一行时,贴心为我们处理了换行符,并且知道我们一般不想要这个换行,将它顺势换成了终止符’\0’(note:为什么live writer

If the first character read is the end-of-file character, a null character is stored at the beginning of buffer and NULL is returned.

_getws is a wide-character version of gets_s; its argument and return value are wide-character strings.

If buffer is NULL or sizeInCharacters is less than or equal to zero, or if the buffer is too small to contain the input line and null terminator, these functions invoke an invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, these functions return NULL and set errno to ERANGE.

In C++, using these functions is simplified by template overloads; the overloads can infer buffer length automatically (eliminating the need to specify a size argument) and they can automatically replace older, non-secure functions with their newer, secure counterparts. For more information, see Secure Template Overloads.

顺便说一下,scanf与scanf_s、gets与gets_s(note:这里的gets_s里的第一个s表示string即字符串,第二个表示safe)、以及这里的fopen_s和fopen,之所以说带_s的函数安全,并不是说在在用户输入超过缓冲区长度时不报错,而是正好相反,在检测到缓冲区不够时,一定会报错。

From Security Features in the CRT   https://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx

The secure functions do not prevent or correct security errors; rather(而是), they catch errors when they occur. They perform additional checks for error conditions, and in the case of an error, they invoke an error handler (see Parameter Validation).

不会像scanf接收字符到一个char数组里,如果用户输入的字符数超过了缓冲区的长度时,scanf也可能“一声不吭”(注:在一些编译器下,确实会存在这种情况),这种做法在一段时间内可能不会产生什么异常,但是操作不属于自己的内存空间,这本身就是一个漏洞,即所谓的“缓冲区溢出漏洞”,经常被一些黑客利用。想想如果这些被误操作的字节,正好对应一个关键数据,或者是对应一个函数的入口地址注:这种情况下,黑客可以利用缓冲区溢出漏洞将这个入口地址改为它自己编写的木马程序的入口地址。你就悲剧了!纯粹道听途说,自己没试过!!)

》》》可能有些同学对gets_s在接收到超过缓冲区长度的数据时的弹出错误或警告窗体的做法表示不解,其实我的心里是想让按下面方式行事。

一、当用户输入的数据的长度(注:到底指什么要搞清楚)不超过缓冲区长度时,正常接收换行符前的所有字符。

(note:如果不注意的话,这里又是一个pitfall,当然前提是你在使用gets_s时,输入中既有中文,又有英文等西方字符,后面写一篇关于接收单字节字符和宽字符的区别的日志。对于实用程序应该始终使用w_char)。

二、当用户的输入的数据的长度超过缓冲区长度时,接收“第二个参数的值减一”个字符,并将缓冲区最后一个字符设置为终止符。(ASK:宽字符中的终止符是什么样的?两个字节的全0吗?)。

对于我们的第二条愿望,标准库中的默认实现一般会是报错提醒,但是真正的实用的应用程序,用户不会允许自己使用的软件动不动就报错,暂且不讨论有多少用户会使用从控制台接收输入的软件。实际上这也是可以实现的。

From Parameter Validation https://msdn.microsoft.com/en-us/library/ksazx244.aspx

Most of the security-enhanced CRT(C运行时) functions and many of the preexisting(先前存在的) functions validate their parameters. This could include checking pointers for NULL, checking that integers fall into a valid range, or checking that enumeration values are valid. When an invalid parameter is found, the invalid parameter handler is executed.
note:注意这时提到一些验证参数的例子,翻译如下:
一、指针是否为空。
二、整型是否会落入一个有效的范围。
三、检查枚举类型是否有效。
而且如果一个无效的参数被发现,会执行相应的无效参数处理机制。???是每一种类型的参数异常对应一种处理机制吗?

Invalid Parameter Handler Routine
--------------------------------------------------------------------------------
The behavior of the C Runtime when an invalid parameter is found is to call the currently assigned invalid parameter handler. The default(note:这里应该指的是运行时,而不是调试时) invalid parameter invokes Watson crash reporting, which causes the application to crash and asks the user if they want to load the crash dump to Microsoft for analysis. In Debug mode, an invalid parameter also results in a failed assertion.如下图所示,是gets_s函数接收的用户输入超过缓冲区长度时的警告窗口。

image_thumb[8]

This behavior can be changed by using the function _set_invalid_parameter_handler to set the invalid parameter handler to your own function.(note:你可以通过set_invalid_parameter_handler 函数来设定无效参数 的处理机制到你自己定义的函数) If the function you specify does not terminate the application, control is returned to the function that received the invalid parameters, and these functions will normally cease execution, return an error code(note:这个收到无效参数的函数会正常地结束执行,并返回一个错误码。注意反省一下,自己在处理相应的问题时,对于非法输入是都能返回相应的错误码。ASK:在编程时如何利用函数返回值和errno值????), and set errno to an error code. In many cases, the errno value and the return value are both EINVAL, indicating an invalid parameter. In some cases, a more specific error code is returned, such as EBADF for a bad file pointer passed in as a parameter. For more information on errno, see errno, _doserrno, _sys_errlist, and _sys_nerr.
==========

© 著作权归作者所有

zray4u
粉丝 0
博文 216
码字总数 188982
作品 0
西城
私信 提问
解决方案warning C4996: 'fopen': This function or va...

Visual Studio 2005 移植 - WINVER,warning C4996, error LINK1104 一、WINVER Compile result: WINVER not defined. Defaulting to 0x0502 (Windows Server 2003) windows server 2003 win......

我是一只鱼
2011/12/01
0
2
【资料整理】Security Features in the CRT

本文简要整理了 MSDN 上关于 “Security Features in the CRT” 方面的内容。详细参考官网。 许多老旧的 CRT 函数都有更新且更加安全的后续版本。在安全版本存在的情况下,老旧版本都会被标识...

摩云飞
2013/01/18
0
0
openssl

DESCRIPTION OpenSSL介绍 OpenSSL是一个加密工具包,实现了安全套接字层(SSL v2/ v3)和传输层安全(TLS v1)网络协议以及它们所要求的相关密码学标准。 openssl程序是一个命令行工具,用于从s...

懿懿懿
2017/12/02
0
0
Hive 各版本关键新特性(Key New Feature)介绍

开源世界里的代码受社区推动和极客文化的影响,变化一直都很快。这点在 hadoop 生态圈里表现尤为突出,不过这也与 hadoop 得到业界的广泛应用以及各种需求推动密不可分(近几年大数据、云计算...

大数据之路
2014/06/04
0
3
SonarQube C/C++/Objective C 4.1 发布

SonarQube C/C++/Objective C 4.1 发布了,Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。支持的语言包括:Java、PHP...

局长
2016/08/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
26分钟前
1
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
27分钟前
0
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
28分钟前
0
0
代理模式

保护代理和虚拟代理 虚拟代理 把开销大的操作等到需要执行创建的时候再去执行创建 var myImage = +function () { var imgNode = document.createElement('img'); docume......

莫西摩西
35分钟前
2
0
从国企到互联网,程序员六年四段工作经历,一份被很多 HR都 刷掉的简历!

程序员,六年,四段工作经历,这也许是一份会被很多 HR 刷掉的简历。 从学生时代至今,我经历了两次大的方向转型和一次大的技术转型: 从偏理论推导的数学科学到重工程实践的计算机学科,从「...

我最喜欢三大框架
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部