对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/