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

这些天我读到了关于缓冲区溢出攻击的文章,实际上我不能说我已经了解了全局,我心里有些怀疑

因此,为了消除我的疑虑,问题出现了,如果我的程序是用C编写的,所有用于获取输入或复制/合并缓冲区、检查边界的代码都会发生缓冲区溢出吗?或者直接说,输入(无论来自何处)是攻击者可以用来导致缓冲区溢出的唯一方法吗

例如,考虑下面的代码:

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,但您没有考虑错误情况。手册页声明“然后字符串就是术语