很多年了,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(使用前将#替换为@)