Пользовательский Django для сложной Func (функция sql)Python

Программы на Python
Ответить
Anonymous
 Пользовательский Django для сложной Func (функция sql)

Сообщение Anonymous »

В процессе поиска точного решения для Django ORM я создал собственную функцию django Func:

Код: Выделить всё

from django.db.models import Func

class Position(Func):
function = 'POSITION'
template = "%(function)s(LOWER('%(substring)s') in LOWER(%(expressions)s))"
template_sqlite = "instr(lower(%(expressions)s), lower('%(substring)s'))"

def __init__(self, expression, substring):
super(Position, self).__init__(expression, substring=substring)

def as_sqlite(self, compiler, connection):
return self.as_sql(compiler, connection, template=self.template_sqlite)
который работает следующим образом:

Код: Выделить всё

class A(models.Model):
title = models.CharField(max_length=30)

data = ['Port 2', 'port 1', 'A port', 'Bport', 'Endport']
for title in data:
A.objects.create(title=title)

search = 'port'
qs = A.objects.filter(
title__icontains=search
).annotate(
pos=Position('title', search)
).order_by('pos').values_list('title', flat=True)
# result is
# ['Port 2', 'port 1', 'Bport', 'A port', 'Endport']
Но, как прокомментировал @hynekcer:


"Он легко выходит из строя by ') in '') from myapp_suburb; drop ...
ожидалось, что имя приложения — «myapp и автофиксация включена».


Основная проблема в том, что лишние данные (

Код: Выделить всё

substring
) попал в шаблон без sqlescape, что делает приложение уязвимым для атак с помощью SQL-инъекций.

Я не могу найти способ защиты от этого в Django.



Я создал репозиторий (djposfunc), где вы можете протестировать любое решение.

Подробнее здесь: https://stackoverflow.com/questions/464 ... l-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»