.extra() パラメータを使用して生の SQL クエリを実行する manager.py ファイルがあります。例えば:
class MyManager(models.Manager):
def order_null_last(self, field):
return super(DecisionManager, self).get_query_set()\
.extra(select={'has_field': "CASE WHEN " + field + " IS NULL THEN 1 ELSE 0 END"}).order_by('has_field', field)
この種のクエリは、インジェクションによる攻撃に対して脆弱である可能性があることが示唆されています。
変数 'field' は、正当な値のグループに属していることを確認するために解析されますが、このチェックはビューで行われます。例えば:
class ModelList(ListView):
model = MyModel
def get(self, request, *args, **kwargs):
self.set_sorting(request)
def set_sorting(self, request):
self.sort_field = request.GET.get('sort', '-id')
if not self.sort_field in self.sort_options:
self.sort_field = 'id'
そのため、誰かが上記のマネージャーを使用して新しいビューを作成したが、パラメーターをフィルタリングするのを忘れた場合、エクスプロイトが可能になります。
では、循環インポートを取得せずにマネージャーのモデル フィールドに対してパラメーターを検証する方法はありますか? つまり、マネージャは許可されたフィールドのリストを取得するためにモデルをインポートする必要がありますが、モデルはマネージャをインポートする必要があります。