1

unwind我上一个问题的回答引出了另一个问题。我曾经问过关于

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

放松回复为

值得警告,因为它可能存在安全风险,如果字符串参数在运行时可更改,则 % 可能会“潜入”,这将导致问题。因此,最好将格式化字符串硬编码为“做你想做的事”。

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

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

4

1 回答 1

3

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所以没有危险,但编译器没有进行那种级别的分析——它只知道非文字格式的字符串是一种风险。

于 2013-04-16T09:40:49.270 回答