`scanf("%d", ...)` 和 `gets` 一样糟糕吗?

2024-01-09

很多年了,gets被普遍贬低为不安全的功能。 (规范的SO问题是为什么 gets 函数如此危险以至于不应该使用它? https://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used). The gets函数太糟糕了,以至于它已从 C11 语言标准中删除。支持者gets(很少有)会争辩说,如果您了解输入的结构,那么使用它是完全可以的。

为何贬低的人gets并承认依赖输入结构的愚蠢之处允许使用%d as a scanf转换说明符?这是一个社会学问题,真正的问题是:为什么%d in a scanf格式化字符串不安全?


No, scanf("%d", …)并不那么糟糕gets.

gets之所以如此糟糕,是因为几乎不可能在任何环境中安全地使用它。缓冲区溢出是有可能发生的,无法避免,并且很可能导致任意严重的后果。

可能发生的最糟糕的事情scanf("%d", …),另一方面,是integer溢出。虽然这在理论上也是未定义的行为,但实际上它总是会导致(a)安静的环绕,(b)溢出到INT_MAX or INT_MIN,或 (c) 可能终止调用程序的运行时异常。

很难想象攻击者可以使用以下方式利用程序的场景:scanf("%d", …)。涉及的漏洞gets另一方面,这是司空见惯的。

(虽然不是问的问题,但确实如此scanf("%s", …)正是如此危险gets。这是一个公平的问题,为什么前者并不总是像后者那样受到强烈的贬低。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`scanf("%d", ...)` 和 `gets` 一样糟糕吗? 的相关文章

随机推荐

  • 如何使用 F# 可区分联合类型作为 TestCase 属性参数?

    我正在尝试测试 F 函数的返回结果是否与预期的可区分联合案例匹配 我正在使用 NUnit 来创建测试 它不喜欢将受歧视的联合类型作为TestCase范围 以下测试用例无法编译
  • 动态AndroidManifest.xml

    是否可以动态定义 AndroidManifest xml 的各个方面 例如 是否可以使用 Java 代码动态注册或编辑活动 服务和接收者的定义 如果是这样 此代码的放置位置是否有任何限制 还有什么可以动态定义的 我相信大多数可用的操作都由包
  • 打印 TCP 数据包数据

    在TCP通信中 当数据包从以太网传输到网络 IP 层时 我想打印该数据包中存在的数据 我正在Linux上工作 我得到一些信息 它可以在 Linux 内核代码的帮助下完成 即在 Linux NAT 防火墙代码中 但是我从哪里可以获得内核源代码
  • Android 使用 include 标签在 ConstraintLayout 中添加其他布局

    我正在使用 ConstraintLayout 制作一个简单的测试应用程序 但我有一个问题 这是我的代码 活动 main xml
  • 错误:“i”的名称查找已更改为 ISO“for”范围 [-fpermissive] [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 问 编写一个程序 发出 您不喜欢的单词 也就是说 您使用 cin 读取单词并在 cout 上再次打印它们 如果某个单词属于您定义的
  • 在unity3d中制作后台线程

    我有 wp7 应用程序有两个后台线程 1 时间规划 2 按计划时间播放不同的声音样本 同一时间可能有几个样本 如何用unity 3d引擎重复这个逻辑 是否可以 Unity 不允许您从主线程以外的任何线程访问其 API 你不能使用锁定原语来绕
  • Conda 包的版本信息与 __version__ 不对应

    我正在使用蟒蛇 myenv3 foo foo which conda home foo anaconda3 bin conda 在 myenv3 中我有dill 2 8 2安装 myenv3 foo foo conda list n mye
  • 更改时将事件附加到属性

    c silverlight 是否有任何功能可以让我在不使用依赖属性的情况下监视用户控件的属性 以了解何时进行任何更改 我想要一个不是静态的 有两种标准机制可以实现 观察 模式 即所描述的模式 一是使用依赖属性 另一个是INotifyProp
  • 如何使用 Intent Extras 传递可序列化对象的数组?

    我想传递一个对象数组而不使用首选项 我用意向 对象类 Bts public class Bts implements Serializable int idbts String nombts String ipaddress String
  • 边框宽度变化时不影响其他元素的定位

    我想在悬停时更改圆圈的边框宽度 而不影响其他元素的位置 会更清楚这个jsFiddle https jsfiddle net xhanrkzy HTML span class menu i class cercle i Foo span sp
  • 未配置 Google 日历 API 访问权限

    我从这里下载了一个示例项目 http code google com p google api java client source browse calendar android sample repo samples http code
  • Arduino 错误:无法将参数 '1' 的 'String' 转换为 'char*' 到 'char* strtok(c​​har*, const char*)'

    我正在研究一个 arduino 分配 它分割传入的字符串并将字符串的术语放入 6 个不同的变量中 分割时的示例输入字符串有 6 个术语 我弹出以下错误 无法将参数 1 的 String 转换为 char 到 char strtok c ha
  • 你是质数吗

    多年来我一直对寻找更好的素数识别器的问题感兴趣 我意识到这是一个巨大的学术研究领域 我对此的兴趣实际上只是为了好玩 这是我在 C 语言中第一次尝试可能的解决方案 如下 我的问题是 你能提出改进建议吗 没有引用网上的其他参考资料 我正在寻找实
  • 在 VSCode 中,保存时退出 Vim 插入模式

    我将 VSCode 与 VSCodeVim 扩展一起使用 在插入模式下 我可以按 CMD S 进行保存 当我这样做时 我还想自动退出插入模式 而不是按 ESC 这可能吗 我也在寻找与此问题类似的解决方案 vscode 中似乎无法将多个命令映
  • 实施 isalpha 时遇到问题

    我一直在研究CS50的可读性问题 第一步是创建一种仅计算字母字符的方法 它建议使用isalpha函数 但并不真正包含如何实现它的说明 下面是我的代码 它成功地计算了字母字符总数 但未能过滤掉标点符号 空格和整数 谁能指出我更好的方向来实施i
  • 街道地址的正则表达式

    我正在尝试匹配包含街道和号码的街道地址 我需要表达式来匹配街道名称的单词 后跟数字 例如 我想匹配 somestreet 25 some other street 23 a third street 190 但不匹配 a fourth st
  • 使用 Python 向 Microsoft Teams 发送自动消息

    我想运行一个 Python 脚本 最后通过 MS Teams 将结果以文本格式发送给几个员工 是否有任何已构建的库允许我通过 Python 代码在 Microsoft Teams 中发送消息 1 在 MS Teams 中创建 webhook
  • R清理csv文件

    我正在研究天气数据 我正在尝试清理 csv 文件 但不断收到奇怪的错误 在 csv 文件中 9999 和 9999 是空值 我想删除一半以上值为 9999 或 9999 的所有列 我读了 csv 文件 然后初始化一个空矩阵 使其与读取 cs
  • VBA循环遍历文件夹中的Excel工作簿并复制数据-不循环遍历所有文件

    我试图让 VBA 宏循环遍历特定文件夹中的所有 xls 文件 下面的代码在大多数情况下都有效 然而 我在这个文件夹中有 42 个文件 代码只循环其中大约 26 个 它们都是相同的文件扩展名 我的想法是它要么没有循环遍历所有文件 或者它正在循
  • `scanf("%d", ...)` 和 `gets` 一样糟糕吗?

    很多年了 gets被普遍贬低为不安全的功能 规范的SO问题是为什么 gets 函数如此危险以至于不应该使用它 https stackoverflow com questions 1694036 why is the gets functio