2013-04-18 3 views
0

У меня есть веб-приложение, которое позволяет пользователям вводить поисковый запрос, который затем будет извлекать модели, соответствующие этим критериям поиска. Вот мои методы:icontains и SQL Security

@staticmethod 
def searchBody(query): 
    ''' 
    Return all entries whose body text contains the query. 
    ''' 
    return Entry.objects.get(text__icontains=query) 

@staticmethod 
def searchTitle(query): 
    ''' 
    Return all entries whose title text contains the query. 
    ''' 
    return Entry.objects.get(title__icontains=query) 

@staticmethod 
def searchAuthor(query): 
    ''' 
    Return all entries whose author text contains the query. 
    ''' 
    return Entry.objects.get(author.icontains=query) 

Мой вопрос просто: безопасно ли это? Другими словами, делает ли incontains необходимые операции экранирования строк, чтобы человек не мог вставлять SQL или код Python в запрос для запуска атаки?

ответ

2

Да, Django ORM защищает вас от SQL-инъекций.

Конечно, вы никогда не можете быть полностью уверены, что в приложении нет уязвимости системы безопасности. Тем не менее, ORM является компонентом, ответственным за защиту вас от SQL-инъекций, поэтому вы должны считать, что это безопасно, и держите свою django в устаревших версиях!


На несвязанной ноте, есть опечатка в Entry.objects.get(author.icontains=query).

Также, используя .get, здесь будет много ошибок (всякий раз, когда объект не существует или существует более одного). Это не делает то, что говорит ваша докшлина.

Вместо этого вы, скорее всего, захотите использовать .filter.

+1

Кроме того, вы можете выполнить запрос . Введите request.objects.get (author__contains = 'test') запрос и проверьте, что Django делает с вашим параметром. –

Смежные вопросы