¿Los clientes pueden ejecutar mi CGI de Python a voluntad?

2

Tengo un sitio donde se interactúa con la base de datos principal a través de scripts de python ubicados en public_html\cgi-bin\ . Para ejecutar comandos, varios scripts de JavaScript, ubicados en \public_html\scripts\ , usan jQuery para llamar a los diferentes scripts de Python.

Tengo algunos scripts de Python, como uno que se usa para eliminar y agregar entradas restringidas a los usuarios que han iniciado sesión a través de las cuentas .htaccess. Sin embargo, los scripts CGI y JavaScript que interactúan con ellos también se encuentran en las mismas carpetas. ¿Es esto peligroso? ¿Pueden los clientes de alguna manera llamar a mis scripts CGI de Python con sus propias variables CGI, o ejecutar mis scripts de JavaScript para hacer eso por ellos?

¿Cómo puedo mantener estos scripts seguros, si es así?

    
pregunta FreeSnow 08.05.2013 - 11:31
fuente

2 respuestas

3

Si el navegador de un usuario puede llamar (enviar solicitudes HTTP a) sus scripts de Python (con o sin AJAX), suponga que un usuario autenticado podrá enviar solicitudes HTTP personalizadas, incluidas las variables (parámetros) que desee. .

Siempre asume que no solo tus usuarios pueden ver tu código JavaScript, sino que también pueden modificarlo, anularlo o deshabilitarlo por completo.

Poner sus archivos HTML, JS o Python en la misma carpeta (directorio) no es un problema. Pero le aconsejaría que mueva sus scripts que contienen información confidencial (como sus credenciales de base de datos) sobre su directorio public_html (su raíz www ).

    
respondido por el Adi 08.05.2013 - 12:15
fuente
2

Como regla general, nunca confíe en los comentarios del usuario , incluso si está seguro de que solo provendrá de usuarios autenticados. Si alguno de sus scripts CGI está orientado a Internet (es decir, puede ejecutarse como una consecuencia directa de las solicitudes de sus usuarios, ya sean las llamadas jQuery ajax o el acceso regular a la página), debe desinfectar todos los campos de entrada y verificar la autenticación y autorización adecuadas Cualquier acción sensible.

Detalles:

Si su servidor web está configurado para ejecutar automáticamente scripts en la carpeta cgi-bin en respuesta a una dirección URL coincidente, entonces todos los scripts dentro de esa carpeta son susceptibles de ser llamados por los usuarios, de una manera que no puede predecir o controlar. Si tiene scripts que no deben llamarse de esta manera, entonces debe almacenarlos en otro lugar o configurar su servidor web para que no los ejecute automáticamente (por ejemplo, incluir en una lista blanca las URL que coincidirán directamente con los recursos del servidor).

(Si tiene dudas sobre si un script en particular está o no expuesto, simplemente reemplácelo por uno inocuo e intente llamarlo a través de la URL correspondiente)

En cuanto a los otros scripts (aquellos que están destinados a ser llamados desde fuera), todavía tiene los problemas de no tener control de quién los llamará, en qué circunstancias se llamarán, y si serán o no llamados con los parámetros correctos. Usted podría intentar incluir en la lista blanca las direcciones IP o verificar el referente HTTP, pero no son a prueba de balas. El JavaScript que los llama siempre puede ser modificado por el cliente, y de manera trivial (por ejemplo, modificar la página en vivo usando bookmaklets), por lo tanto, no hay manera de saber si el código que preparó esas solicitudes no está controlado, incluso si se ejecutan en su contexto de la página. Y el usuario siempre puede cambiar los parámetros de la secuencia de comandos a valores arbitrarios, ya sea haciendo un mal uso de su código o utilizando el suyo propio (o alterando directamente la solicitud HTTP, entre otros medios).

Por esas razones, para estar realmente seguro, siempre debe realizar una validación completa de la solicitud antes de ejecutarla: use una CSRF token , autentique al usuario que realiza la solicitud (utilizando una cookie de sesión segura, por ejemplo, pero .htaccess auth también debería funcionar), verifique la autorización del usuario ambos para realizar esa acción y usar la proporcionó los parámetros, y verifique todos los parámetros para los tipos / sintaxis correctos y los valores válidos. Puede parecer mucho trabajo, pero una vez que te acostumbras a estas prácticas, rápidamente se convierte en una segunda naturaleza (y como estás usando Python, un consejo adicional: busca decorators si no los conoces, hará mucho más fácil la tarea de aplicar muchas de las medidas anteriores en diferentes funciones / scripts).

    
respondido por el mgibsonbr 08.05.2013 - 12:17
fuente

Lea otras preguntas en las etiquetas