对aa的回答引出了另一个问题。我曾经问过

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

unwind回复为
值得一提的是,因为这可能是一个安全风险,如果字符串参数在运行时是可更改的,则有可能是“偷偷进入”,这将导致问题。因此,最好将格式化字符串硬编码为“随心所欲”。
我想知道如何在运行时更改字符串参数?
编辑:为了更清楚,有谁能给我一个例子,如何在运行时更改字符串参数?

最佳答案

unwind无疑指的是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/

10-11 21:29