2012-05-03 29 views
0

我使用fork()/执行exec()/等待(),而不是系统()时,该命令具有用户输入它的一些参数,使用户不能把类似...popen()的安全版本?

&rm -rf /home/* && echo HAHA 

......作为一个论点。

我假设popen和system()一样危险,因为它只需要一个字符串,而不是象exec函数家族那样的字符串列表。

虽然我只能从exec函数获取返回值。有没有一个“安全”的popen版本,我可以用用户输入运行并在父进程中处理stdout/stderr?

回答

3

安全的方法是自己设置必要的管道,直接使用直接呼叫pipe()

这就是popen()所做的,但它也调用shell来运行子进程。跳过这一步应该使它更安全。

+0

+1是的,只要看看popen源代码(例如:http://www.cse.lehigh.edu/~brian/course/2011/cunix/notes/ch11/popen.c) –

+0

@Adriano,很好......谢谢。你也放松。看起来popen已经使用execl;我可能只是复制它,但传递参数作为null终止的va_list或char * []并调用execv而不是execl。 –