Доступ к очистителю SQL Django в автономном режиме - PullRequest
0 голосов
/ 29 декабря 2011
cursor.execute("SELECT word_id from words where word_name = '%s'" %
                   (word))
    if cursor.fetchone() == None:
        return False
    return True

Я думал, что включение явного ' при закрытии параметра формата %s может предотвратить это, но

"'best'; DELETE * FROM words;"

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

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Если вы не делаете это из приложения django, вам не нужно полагаться на API django для защиты от атак SQL-инъекций. API db, с которым вы работаете, предоставит свои собственные методы для безопасного ввода параметров в запросы SQL. Например, если вы используете SQLite, вы можете обратиться к документации по http://docs.python.org/library/sqlite3.html, чтобы узнать, как безопасно построить параметризованный оператор SQL:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)
1 голос
/ 29 декабря 2011

Не можете ли вы использовать raw() Manager для выполнения вашего запроса?Это все равно будет использовать функции очистки Django SQL, но позволит вам выполнять необработанные SQL-запросы к вашей модели.

В этом случае я предполагаю, что модель называется «Word», поэтому

Word.objects.raw("SELECT word_id from words where word_name = %s", [word])

должно работать просто отлично.Обратите внимание, что вы используете слово в качестве параметра, а не прямую строку, которая защищает вас.Документация для raw() находится здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...