首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >snprintf -安全风险

snprintf -安全风险
EN

Stack Overflow用户
提问于 2013-04-16 09:33:08
回答 1查看 1.2K关注 0票数 1

unwindmy previous question的回答引出了另一个问题。我以前经常问关于

代码语言:javascript
复制
const char *INTERFACE        = "wlan0";
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), INTERFACE);

unwind回答为

这是值得警告的,因为它可能是一个安全风险,如果字符串参数在运行时是可更改的,那么%可能会“潜入”,从而导致问题。因此,如果格式化字符串被硬编码为“做你想做的”,那就更好了。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-16 09:40:49

毫无疑问,unwind指的是INTERFACE变量。

如果出于某种原因,您询问用户应该使用哪个界面(使用类似于fscanf()的可写缓冲区)并进入"wlan0 %s",则可能会发生故障,因为此时您正在有效地执行:

代码语言:javascript
复制
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "wlan0 %s");

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

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

代码语言:javascript
复制
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", INTERFACE);

因此,某些人篡夺INTERFACE,除了改变ifr.ifr_name中的内容外,不会对该语句产生任何影响。

就你的具体情况而言:

代码语言:javascript
复制
#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,所以没有危险,但是编译器没有进行这种级别的分析-它只是知道非文字格式字符串是一个风险。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16033468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档