2011-04-29 19 views
13

以下是危险的吗?JSON可以安全地用作命令行参数还是需要首先进行消毒?

$ myscript '<somejsoncreatedfromuserdata>' 

如果是这样,我该怎么做才能使它不危险?

我意识到这可以依赖于shell,OS,用于进行系统调用的实用程序(如果在编程语言中完成的)等。但是,我只想知道我应该看什么类型的东西为...而出。

+0

AFAIK,这不应该有害,因为正确和有效的JSON总是会有括号包装它,除非你在命令行上运行JSON中的任何参数,否则你应该是安全的。 – 2011-04-29 04:12:56

+0

你控制它的输入和处理吗?你收到的json对象怎么做? – ljkyser 2011-04-29 04:13:26

+0

在这个理论的例子中,一旦我得到了输入,我就放弃它,或者做任何我想要的安全的事情。我只想知道JSON中的某些字段是如何轻松地避免引号执行某种命令行注入攻击的。 – 2011-04-29 05:06:13

回答

14

是的。这很危险。

JSON可以在字符串值中包含单引号(它们不需要转义)。请参阅json.org的“曲目”。

想象中的数据是:

{"pwned": "you' & kill world;"} 

编码愉快。


我会考虑的问题在管道中的数据的程序(例如使用"popen""exec"直接传递参数,甚至一个版本) - 这可以避免穿过外壳,例如导致问题。就像使用SQL一样:使用占位符消除了“逃避”的琐事。


如果穿过外壳是唯一的办法,那么这可能是一种选择(它没有测试过,但类似的东西有效,对于一个“< SCRIPT>”上下文):

对于每一个字符在JSON中,在ASCII中“空格”到“〜”的范围之外,或者在外壳的''上下文中具有特殊含义,如\'(但不包括"或任何其他字符 - 例如作为数字 - 可以出现外部的“字符串”数据,这是这种不重要的方法的限制),然后enc使用\uXXXX JSON表单对字符进行说明。 (根据上面定义的限制,这应该只编码出现在JSON的“字符串”内的潜在有害字符,并且不应该有\\对,没有结尾\和没有' s等)

+1

凉豆。我实际上使用python子进程模块,所以我很确定我会在Popen类中安全,但总体上还是很好奇。 – 2011-04-29 05:02:29

相关问题