2011-04-29 17 views
13

¿Es peligroso lo siguiente?¿Es seguro usar JSON como un argumento de línea de comando o necesita ser desinfectado primero?

$ myscript '<somejsoncreatedfromuserdata>' 

Si es así, ¿qué puedo hacer para que no sea peligroso?

Me doy cuenta de que esto puede depender del shell, SO, utilidad utilizada para hacer llamadas al sistema (si se hace dentro de un lenguaje de programación), etc. Sin embargo, solo me gustaría saber qué tipo de cosas debo ver Fuera por.

+0

AFAIK, esto no se ser dañino ya que el JSON correcto y válido siempre tendrá corchetes que lo envuelven, hasta que, a menos que esté ejecutando algún parámetro del JSON en la línea de comandos, esté seguro. –

+0

¿Controla la entrada y el procesamiento de la misma? ¿Qué haces con el objeto json una vez recibido? – ljkyser

+0

En este ejemplo teórico, una vez que obtengo la información, la descarto o hago lo que sea seguro con ella. Solo quiero saber cuán fácil es para algún campo dentro del JSON escapar de las citas hacer algún tipo de ataque de inyección de línea de comando. –

Respuesta

14

Sí. Eso es peligroso.

JSON puede incluir comillas simples en valores de cadena (no es necesario que se escapen). Consulte "las pistas" en json.org.

imaginar los datos es:

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

feliz de codificación.


yo consideraría tuberías de los datos para el programa en cuestión (por ejemplo, utilizar "popen" o incluso una versión de "exec" que pasa argumentos directamente) - esto puede evitar los problemas que resultan de pasar a través de la carcasa, por ejemplo . Al igual que con SQL: el uso de marcadores de posición elimina la necesidad de jugar con "escaparse".


Si pasa a través de una concha es la única manera, entonces esta puede ser una opción (que no se ha probado, pero algo similar es aplicable a un contexto "< script>"):

para cada carácter en el JSON, que está fuera del rango de "espacio" en "~" en ASCII o tiene un significado especial en el contexto '' de un shell como \ y ' (pero excluyendo " o cualquier otro carácter, por ejemplo como dígitos: puede aparecer fuera de de datos de "cadena", que es una limitación de este enfoque trivial), luego enc oda el personaje usando el formulario JSON \uXXXX. (Por las limitaciones definidas anteriormente esto sólo debe codificar caracteres potencialmente dañinos que aparecen dentro de las "cadenas" en el JSON y no debe haber \\ pares, no se arrastra \, y no hay ' s, etc.)

+1

frijoles fríos. De hecho, estoy usando el módulo de subproceso de python, así que estaba bastante seguro de que estaría a salvo con la clase de Popen, pero todavía tenía curiosidad en general. –

Cuestiones relacionadas