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回答为
这是值得警告的,因为它可能是一个安全风险,如果字符串参数在运行时是可更改的,那么%可能会“潜入”,从而导致问题。因此,如果格式化字符串被硬编码为“做你想做的”,那就更好了。
我想知道如何在运行时更改字符串参数?
编辑:更清楚的是,谁能给我一个例子,如何更改运行时的字符串参数?
发布于 2013-04-16 09:40:49
毫无疑问,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,所以没有危险,但是编译器没有进行这种级别的分析-它只是知道非文字格式字符串是一个风险。
https://stackoverflow.com/questions/16033468
复制相似问题