В этой статье используется:
- Python (Версия 3)
- psycopg2
Содержание
Что такое SQL-инъекция?
Это методика внедрения кода для атак на приложения, подключенные к базе данных, при которой вредоносные инструкции включаются в поле ввода данных.
Схема
Допустим, у нас есть веб-страница, на которой через текстовую форму пользователи могут оставлять комментарии.
В приведенном ниже фрагменте кода информация принимается и сохраняется.
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ('$s')" % content)
conn.commit()
conn.close()
Code language: JavaScript (javascript)
Где проблема в приведенном выше коде? Вы сможете ее найти?
Прежде чем выявлять и устранять проблему, давайте посмотрим в документации psycopg, о чем она нам говорит:
Перевод: документация предупреждает нас никогда, НИКОГДА не использовать объединение строк (+) или интерполяцию строк (%) для передачи переменной в строку SQL.
К чему это может привести?
Делая это таким образом (cursor.execute(“insert into comments values (‘$s’)” % content)). При использовании, например, кавычек или другого специального символа, код выдаст ошибку 500 (Internal Server Error), поскольку символ напрямую соединяется со строкой SQL, вызывая ее поломку.
Как это исправить?
Исправим наш код, чтобы решить проблему, согласно документации psycopg в рамке, выделенной зеленым цветом:
def add_comments(content):
conn = psycopg2.connect("dbname=yourdatabase")
cursor = conn.cursor()
cursor.execute("insert into comments values ($s)", (content,))
conn.commit()
conn.close()
Code language: JavaScript (javascript)
Итак, проблема решена, и мы защитили себя от SQL Injection.