将被污染的数据直接作为参数传递给对缓冲区进行处理的库函数、API 可能会造成缓冲区溢出。
对于禁止使用被污染的数据作为缓冲区的情况,示例1给出了不规范用法(C/C++ 语 言 ) 示 例 。 示 例 2 给 出 了 规 范 用 法(C/C++ 语言)示例。
示例1:
#include<stdio.h)
void f(char *buffer,char *str){
scanf("%s",str);
stprintf(buffer,"%s",str);
在如上示例中,函数 stprintf()通过字符串打印的方式,将 str 复 制 到 目 的 缓 冲 区 buffer 中 。 由 于 源字符串 str 是污点数据,其长度可能会超过目的缓冲区 buffer 的长度,该复制动作,可能会导致缓冲 区溢出 。
示例2:
#include <stdio.h>
void f(char *buffer, char *str){
stprintf(buffer,"%s",str);
如上示例中,str 没有被污染。但在调用该函数前,仍需要对其长度进行验证,以确保该长度值不会超过目的缓冲区的长度。