Actualmente estamos creando una aplicación que ejecuta varias herramientas externas. A menudo tenemos que pasar la información ingresada en nuestro sistema por los usuarios a estas herramientas.Prevención de ataques de inyección en la línea de comandos
Obviamente, esta es una gran pesadilla de seguridad esperando a suceder.
Desafortunadamente, todavía no hemos encontrado ninguna clase en .NET Framework que ejecute programas de línea de comandos mientras que proporciona el mismo tipo de protección contra los ataques de inyección que los objetos de IDbCommand para las bases de datos.
En este momento, estamos usando una sustitución de cadenas muy primitiva que sospecho que es más bien insuficiente:
protected virtual string Escape(string value) { return value .Replace(@"\", @"\\") .Replace(@"$", @"\$") .Replace(@"""", @"\""") .Replace("`", "'") ; }
Qué hacen ustedes para prevenir ataques de inyección de línea de comandos? Estamos planeando implementar una expresión regular que sea muy estricta y solo permita el paso de un subconjunto muy pequeño de personajes, pero me preguntaba si habría una forma mejor.
Algunas aclaraciones:
- Algunas de estas herramientas no tienen APIs podemos programar en contra. Si lo hicieran, no estaríamos teniendo este problema.
- Los usuarios no eligen herramientas para ejecutar, sino que ingresan metadatos que las herramientas que hemos elegido usan (por ejemplo, inyectando metadatos como notificaciones de derechos de autor en archivos de destino).