C 此代码是否包含缓冲区溢出?
这些天我读到了关于缓冲区溢出攻击的文章,实际上我不能说我已经了解了全局,我心里有些怀疑 因此,为了消除我的疑虑,问题出现了,如果我的程序是用C编写的,所有用于获取输入或复制/合并缓冲区、检查边界的代码都会发生缓冲区溢出吗?或者直接说,输入(无论来自何处)是攻击者可以用来导致缓冲区溢出的唯一方法吗C 此代码是否包含缓冲区溢出?,c,security,buffer,stack-overflow,fgets,C,Security,Buffer,Stack Overflow,Fgets,这些天我读到了关于缓冲区溢出攻击的文章,实际上我不能说我已经了解了全局,我心里有些怀疑 因此,为了消除我的疑虑,问题出现了,如果我的程序是用C编写的,所有用于获取输入或复制/合并缓冲区、检查边界的代码都会发生缓冲区溢出吗?或者直接说,输入(无论来自何处)是攻击者可以用来导致缓冲区溢出的唯一方法吗 例如,考虑下面的代码: int main(){ int size = 15; char buf[size]; fgets(buf, size , stdin); prin
例如,考虑下面的代码:
int main(){
int size = 15;
char buf[size];
fgets(buf, size , stdin);
printf("%s",buf);}
是否容易发生缓冲区溢出?
谢谢!:) 使用“fgets”确实可以防止缓冲区溢出。根据手册页: 函数的作用是:从给定的流中读取的字符数最多比size指定的字符数少一个,并将它们存储在string str.Read中- 当在文件末尾或错误处找到换行符时,自动换行停止。保留换行符(如果有)。如果读取了任何字符并且没有错误, 字符串末尾追加了一个“\0”字符 注意上面的“防止”。如果将大小设置为大于实际缓冲区,则可以提取超出缓冲区所能容纳的信息,从而导致缓冲区溢出。建议使用
sizeof(buf)
防止可能超出缓冲区大小。使用“fgets”确实可以防止缓冲区溢出。根据手册页: 函数的作用是:从给定的流中读取的字符数最多比size指定的字符数少一个,并将它们存储在string str.Read中- 当在文件末尾或错误处找到换行符时,自动换行停止。保留换行符(如果有)。如果读取了任何字符并且没有错误, 字符串末尾追加了一个“\0”字符 注意上面的“防止”。如果将大小设置为大于实际缓冲区,则可以提取超出缓冲区所能容纳的信息,从而导致缓冲区溢出。建议使用
sizeof(buf)
以防止可能超出缓冲区大小。实际上,代码中存在错误,并且可能存在潜在的安全问题,在某些应用程序中进行类似的编码!简而言之,检查返回值很重要 虽然有人可能会认为他的程序确实是安全的,但更大的问题是关于代码上的模式,并确保代码的假定不变量,即buf,包含一个0到14字节长的以NULL结尾的字符串 从手册页: 函数的作用是将数据流中的字节读入s指向的数组,直到n-1字节 已读取,或a已读取并传输到s,或遇到文件结束条件。 然后字符串以空字节终止 返回值 成功完成后,fgets()应返回s。如果流位于文件末尾,则 应设置流的文件结束指示器,fgets()应返回空指针。 如果发生读取错误,应设置流的错误指示器,fgets()应返回 一个空指针,[CX][Option Start],并应设置errno以指示错误 安排一个错误条件,可能意味着字符串中不能追加NULL,缓冲区会自动分配,因此printf(3)可能会泄漏信息。。想想赫德布莱德 正如chux指出的那样,初始化自动分配的缓冲区
buf[0]='\0'不应依赖代码>,或静态声明buf以使其系统初始化为0,因为在发生错误时,buf的状态未定义
因此,有必要检查fgets的返回值。更像是:
{
char *s;
if ((s = fgets( buf, sizeof buf, stdin)) {
puts( s);
}
}
这是一篇关于安全编程的文章的链接,可能会引起人们的兴趣事实上,代码中存在错误,并且可能存在潜在的安全问题,在某些应用程序中进行类似的编码!简而言之,检查返回值很重要
虽然有人可能会认为他的程序确实是安全的,但更大的问题是关于代码上的模式,并确保代码的假定不变量,即buf,包含一个0到14字节长的以NULL结尾的字符串
从手册页:
函数的作用是将数据流中的字节读入s指向的数组,直到n-1字节
已读取,或a已读取并传输到s,或遇到文件结束条件。
然后字符串以空字节终止
返回值
成功完成后,fgets()应返回s。如果流位于文件末尾,则
应设置流的文件结束指示器,fgets()应返回空指针。
如果发生读取错误,应设置流的错误指示器,fgets()应返回
一个空指针,[CX][Option Start],并应设置errno以指示错误
安排一个错误条件,可能意味着字符串中不能追加NULL,缓冲区会自动分配,因此printf(3)可能会泄漏信息。。想想赫德布莱德
正如chux指出的那样,初始化自动分配的缓冲区buf[0]='\0'不应依赖代码>,或静态声明buf以使其系统初始化为0,因为在发生错误时,buf的状态未定义
因此,有必要检查fgets的返回值。更像是:
{
char *s;
if ((s = fgets( buf, sizeof buf, stdin)) {
puts( s);
}
}
这是一篇关于安全编程的文章的链接,可能会引起人们的兴趣它不会溢出(如果指定的大小不坏),fgets不会只在指定范围内的区域执行写操作。但是有一个错误。。fgets的返回值应为checkedIt not overflow(如果指定的大小不坏),fgets不会仅在指定范围内的区域执行写入操作。但存在错误。。fgets的返回值应该是checkedGood points,但您没有考虑错误情况。手册页声明“然后字符串就是术语