JSON是否可以安全地用作命令行参数,还是需要首先进行清理?

Con*_*ens 13 command-line json

以下危险吗?

$ myscript '<somejsoncreatedfromuserdata>'
Run Code Online (Sandbox Code Playgroud)

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

我意识到这可能取决于shell,OS,用于进行系统调用的实用程序(如果在编程语言中完成)等等.但是,我只想知道应该注意哪些事情.

小智 15

是.这很危险.

JSON可以在字符串值中包含单引号(它们不需要转义).请参阅json.org上的 "轨道" .

想象一下数据是:

{"pwned": "you' & kill world;"}
Run Code Online (Sandbox Code Playgroud)

快乐的编码.


我会考虑将数据输入到有问题的程序中(例如,使用"popen"甚至"exec"直接传递参数的版本) - 例如,这可以避免因通过shell而导致的问题.就像SQL一样:使用占位符消除了使用"转义"的必要性.


如果通过shell是唯一的方法,那么这可能是一个选项(它没有经过测试,但类似的东西适用于"<script>"上下文):

对于JSON中的每个字符,它在ASCII中的"space"到"〜"的范围之外,或者''在shell 的上下文中具有特殊含义,例如\'(但不包括"或任何其他字符 - 例如数字 - 可以出现 "字符串"数据之外,这是这种简单方法的限制),然后使用\uXXXXJSON表单对字符进行编码.(根据上面定义的限制,这应该只编码出现在JSON中"字符串"中的潜在有害字符,并且不应该有\\对,没有尾随\,也没有's等)