Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164629
  • 博文数量: 14
  • 博客积分: 255
  • 博客等级: 二等列兵
  • 技术积分: 621
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 13:12
个人简介

热爱推理

文章分类
文章存档

2015年(2)

2014年(1)

2013年(5)

2011年(1)

2010年(5)

我的朋友

分类: LINUX

2013-10-17 00:13:09

在Linux C 中调用shell命令在多数情况下的确比较方便,只需要调用system或者popen即可

但是,如果shell命令中的输入参数存在字符串,则会出现很多意料之外的事情

例如,一个场景是使用Wifi联网,需要调用wpa_cli命令输入ssid和key:

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid '"MyAP"'
  2. wpa_cli -i ra0 set_network 0 psk '"MyKey"'

于是,在C中可能会为了方便,写成如下形式:


点击(此处)折叠或打开

  1. sprintf(cmd_buf, "wpa_cli -i ra0 set_network 0 ssid \'\"%s\"\'", ssid);
  2. system(cmd_buf);
  3. sprintf(cmd_buf, "wpa_cli -i ra0 set_network 0 psk \'\"%s\"\'", key);
  4. system(cmd_buf);

乍一看,没有任何问题,但是如果用户是:
Will's AP

该命令根本无法正确执行,因为

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid '"Will's AP"'

中已经在"Will's AP"两端使用了单引号进行转义了,于是这对单引号的内部的ssid也有单引号,则会解析到ssid中的第一个单引号为止,
然后,如果在shell中手动测试一下,shell命令行会出现一个提示符"<",提示需要继续输入

实际上,真正想在Linux C中正确调用shell脚本,最好对这类输入参数使用反斜杠转义,例如

点击(此处)折叠或打开

  1. wpa_cli -i ra0 set_network 0 ssid \"\W\i\l\l\'\s\ \A\P\"

这样就不会出错了,在Linux C中对字符串手动转义为如上形式,一个很简单的程序即可实现

还有一个类似的例子,是在Linux C中使用grep命令,这种情况就更加严重了,因为还有好几个符号会被特殊对待,例如'`' '[' 等

再往外扩展,如果是javascript中需要操作html的DOM对象时,也要做合适的处理,例如一个字符串中有'<'这个符号,则会直接被识别为html中的'<'符号了,
需要使用&#的方式进行转义。




阅读(6297) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

controlqsw2013-10-17 23:16:01

flycatorg:system或者popen 一般是不推荐使用的,存在注入式攻击的风险

是的,您说得对,我正在想能否可以直接用socket与wpa_suppliant通信

回复 | 举报

flycatorg2013-10-17 23:02:38

system或者popen 一般是不推荐使用的,存在注入式攻击的风险