以下是危险的吗?JSON可以安全地用作命令行参数还是需要首先进行消毒?
$ myscript '<somejsoncreatedfromuserdata>'
如果是这样,我该怎么做才能使它不危险?
我意识到这可以依赖于shell,OS,用于进行系统调用的实用程序(如果在编程语言中完成的)等。但是,我只想知道我应该看什么类型的东西为...而出。
以下是危险的吗?JSON可以安全地用作命令行参数还是需要首先进行消毒?
$ myscript '<somejsoncreatedfromuserdata>'
如果是这样,我该怎么做才能使它不危险?
我意识到这可以依赖于shell,OS,用于进行系统调用的实用程序(如果在编程语言中完成的)等。但是,我只想知道我应该看什么类型的东西为...而出。
是的。这很危险。
JSON可以在字符串值中包含单引号(它们不需要转义)。请参阅json.org的“曲目”。
想象中的数据是:
{"pwned": "you' & kill world;"}
编码愉快。
我会考虑的问题在管道中的数据的程序(例如使用"popen"
或"exec"
直接传递参数,甚至一个版本) - 这可以避免穿过外壳,例如导致问题。就像使用SQL一样:使用占位符消除了“逃避”的琐事。
如果穿过外壳是唯一的办法,那么这可能是一种选择(它没有测试过,但类似的东西有效,对于一个“< SCRIPT>”上下文):
对于每一个字符在JSON中,在ASCII中“空格”到“〜”的范围之外,或者在外壳的''
上下文中具有特殊含义,如\
和'
(但不包括"
或任何其他字符 - 例如作为数字 - 可以出现外部的“字符串”数据,这是这种不重要的方法的限制),然后enc使用\uXXXX
JSON表单对字符进行说明。 (根据上面定义的限制,这应该只编码出现在JSON的“字符串”内的潜在有害字符,并且不应该有\\
对,没有结尾\
和没有'
s等)
凉豆。我实际上使用python子进程模块,所以我很确定我会在Popen类中安全,但总体上还是很好奇。 – 2011-04-29 05:02:29
AFAIK,这不应该有害,因为正确和有效的JSON总是会有括号包装它,除非你在命令行上运行JSON中的任何参数,否则你应该是安全的。 – 2011-04-29 04:12:56
你控制它的输入和处理吗?你收到的json对象怎么做? – ljkyser 2011-04-29 04:13:26
在这个理论的例子中,一旦我得到了输入,我就放弃它,或者做任何我想要的安全的事情。我只想知道JSON中的某些字段是如何轻松地避免引号执行某种命令行注入攻击的。 – 2011-04-29 05:06:13