Dicen que al usar Django ORM ya estás protegido contra la mayoría de los ataques de inyección SQL. Sin embargo, quería saber si hay medidas adicionales que deberían o pueden usarse para procesar la entrada del usuario. ¿Alguna biblioteca como Bleach?
El principal peligro de usar un ORM de Django es que puede brindarles a los usuarios una herramienta poderosa para seleccionar, filtrar y agregar campos arbitrarios.
De hecho, supongamos, por ejemplo, que crea un formulario que permite a los usuarios seleccionar los campos para devolver, luego puede implementar esto como:
data = MyModel.objects.values(*request.GET .getlist('fields') ) Si MyModel tiene una ForeignKey para el modelo de usuario llamado owner , entonces el usuario podría falsificar una solicitud con owner__password como campo y, por lo tanto, recuperar las contraseñas ( hash ). Si bien Django almacena para su modelo User predeterminado una contraseña cifrada, aún significa que los datos cifrados están expuestos y podría facilitar la recuperación de las contraseñas.
Pero incluso si no hay un modelo de usuario, puede resultar en el hecho de que los usuarios pueden falsificar solicitudes donde usan enlaces a datos confidenciales y, por lo tanto, pueden recuperar una gran cantidad de datos confidenciales. Lo mismo puede suceder con el filtrado arbitrario, la anotación, la agregación, etc.
Por lo tanto, lo que debe hacer es mantener una lista de valores aceptables y verificar que la solicitud solo contenga estos valores, por ejemplo:
acceptable = {'title', 'description', 'created_at'} data = [field for field in request.GET.getlist('fields') if field in acceptable ] data = MyModel.objects.values(*data) Si, por ejemplo, utiliza paquetes como django-filter [readthedocs.io] , enumera los campos que se pueden filtrar y qué búsquedas se pueden hacer para estos campos. Los demás datos en request.GET se ignorarán y, por lo tanto, evitarán el filtrado con campos arbitrarios.