🔒 Как избежать SQL инъекции в Python: советы и рекомендации

Чтобы избежать SQL-инъекций в Python, рекомендуется использовать параметризованные запросы и не конкатенировать входные данные в запросах.

Вот пример с использованием параметризации с помощью модуля sqlite3:


import sqlite3

# Подключение к базе данных
conn = sqlite3.connect('database.db')

# Создание курсора
cursor = conn.cursor()

# Пример параметризованного запроса
name = input('Введите имя: ')
age = input('Введите возраст: ')

cursor.execute('SELECT * FROM users WHERE name = ? AND age = ?', (name, age))
result = cursor.fetchall()

for row in result:
    print(row)

# Закрытие соединения
conn.close()

В приведенном примере, значения name и age передаются как параметры запроса. Это позволяет библиотеке sqlite3 правильно обрабатывать данные и предотвращать SQL-инъекции.

То же самое правило применимо и к другим SQL-библиотекам или ORM-фреймворкам.

Детальный ответ

Как избежать SQL инъекции в Python

При разработке веб-приложений на языке Python и использовании баз данных необходимо уделить особое внимание безопасности. Одной из основных угроз является SQL-инъекция. Эта уязвимость возникает, когда злоумышленник подставляет вредоносный SQL-код в пользовательский ввод, и этот код выполняется на сервере базы данных. В данной статье мы рассмотрим, как избежать SQL инъекции в Python.

1. Использование подготовленных запросов

Одним из самых надежных способов защиты от SQL инъекций в Python является использование подготовленных запросов. Вместо вставки пользовательского ввода напрямую в SQL-запрос, мы используем параметризованные запросы, где значения переменных заменяются плейсхолдерами. Например:


import sqlite3

conn = sqlite3.connect("example.db")
cursor = conn.cursor()

name = input("Введите имя пользователя: ")
age = input("Введите возраст пользователя: ")

cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))

conn.commit()
    

В приведенном выше примере мы используем вопросительные знаки в SQL-запросе вместо прямого включения значений пользователя. Затем мы передаем значения вторым аргументом метода execute. Это позволяет избежать возможности внедрения вредоносного кода в параметры запроса.

2. Использование ORM библиотек

Еще одним способом защиты от SQL инъекций в Python является использование ORM (объектно-реляционное отображение) библиотек. ORM библиотеки позволяют работать с базой данных, используя объекты и методы, а не напрямую писать SQL-запросы. Такие библиотеки обеспечивают защиту от SQL инъекций внутри своей реализации.

Ниже приведен пример использования ORM библиотеки SQLAlchemy:


from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

engine = create_engine("sqlite:///example.db")
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

name = input("Введите имя пользователя: ")
age = input("Введите возраст пользователя: ")

new_user = User(name=name, age=age)
session.add(new_user)
session.commit()
    

В данном примере мы создаем класс User, который наследуется от базового класса declarative_base(). Мы задаем структуру таблицы в классе User и используем объекты этого класса для добавления новых пользователей в базу данных. ORM библиотеки автоматически обрабатывают экранирование пользовательских данных, предотвращая возможность SQL инъекций.

3. Валидация и очистка пользовательского ввода

Кроме использования подготовленных запросов и ORM библиотек, важно также проводить валидацию и очистку пользовательского ввода. Это помогает убедиться, что вводятся только допустимые значения, а также предотвращает внедрение вредоносного кода.

Для валидации и очистки пользовательского ввода можно использовать регулярные выражения, специальные функции для экранирования символов или использовать готовые библиотеки, такие как bleach или html.escape.

Ниже приведен пример валидации и очистки пользовательского ввода с использованием библиотеки bleach:


import bleach

name = input("Введите имя пользователя: ")

clean_name = bleach.clean(name)
    

В данном примере мы используем функцию clean из библиотеки bleach для очистки пользовательского ввода от потенциально опасных символов и тегов HTML.

Вывод

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

Видео по теме

Учимся пентесту на практике с нуля | TryHackMe - Wekor | Wordpress | SQL инъекции

SQL injection - почему, зачем и как защититься от SQL инъекции

SQL Injection - теория и примеры

Похожие статьи:

🔑 Как легко добавить переменную в список в Питоне?

🔑Как открыть новое окно в Python: простой гайд для начинающих

Что означает while true в Питоне? 🤔

🔒 Как избежать SQL инъекции в Python: советы и рекомендации

Как получить сумму цифр в Python? 🧮 Простой способ

Как ввести массив через пробел в Python? 🤔 Учимся правильно!

🔍 Как научиться питону с нуля: пошаговое руководство для начинающих