gpt4 book ai didi

c - snprintf - 安全风险

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:00 27 4
gpt4 key购买 nike

unwind的答案至 my previous question给我带来了另一个问题。我曾经问过关于

的问题
const char *INTERFACE        = "wlan0";
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), INTERFACE);

unwind回复为

It's worth warning for since it can be a security risk, if the string argument is changable at runtime it's possible that a % can be "snuck in", which will lead to problems. Therefore it's better if the formatting string is hardcoded to "do what you want".

我想知道如何在运行时更改字符串参数?

编辑:为了更清楚,谁能给我一个如何在运行时更改字符串参数的例子?

最佳答案

unwind 无疑是指 INTERFACE 变量。

如果出于某种原因你问用户他们应该使用哪个接口(interface)(使用类似 fscanf() 的东西进入可写缓冲区)并且他们输入 "wlan0 %s",一切都可能一团糟,因为你会遇到有效执行的情况:

snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "wlan0 %s");

没有额外的参数对应于格式字符串中的%s

防止这种情况的方法是使用:

snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", INTERFACE);

这样,篡夺 INTERFACE 的人除了更改放入 ifr.ifr_name 的内容外,不会对该语句产生任何影响。

在您的特定情况下:

#include <stdio.h>
#include <net/if.h>
#include <string.h>

int main(int argc,char *argv[]){
const char *INTERFACE = "wlan0";
struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), INTERFACE);

return 0;
}

您仍然完全控制 INTERFACE,因此没有危险,但编译器并未进行该级别的分析 - 它只知道非文字格式字符串存在风险。

关于c - snprintf - 安全风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com