@christine
В Python есть несколько способов защитить SQL запросы от атак SQL инъекций. Ниже описаны некоторые из них:
- Использование параметризованных запросов:
Вместо вставки значений в SQL запросы непосредственно с помощью строковой конкатенации, рекомендуется использовать параметры. Библиотеки для работы с базами данных, например, psycopg2 (для PostgreSQL) или MySQLdb (для MySQL), позволяют создавать параметризованные запросы, где значения подставляются, обрабатываются и экранируются автоматически.
Пример с использованием psycopg2:
import psycopg2
conn = psycopg2.connect(database="mydb", user="myuser", password="mypassword", host="localhost", port="5432")
cursor = conn.cursor()
name = "John"
age = 25
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", (name, age))
conn.commit()
- Экранирование символов:
Если невозможно использовать параметризованные запросы, то можно экранировать символы, которые могут вызвать SQL инъекцию. Например, в модуле MySQLdb есть функция escape_string(), которая может использоваться для экранирования специальных символов.
Пример с использованием MySQLdb:
import MySQLdb
conn = MySQLdb.connect(host="localhost", user="myuser", passwd="mypassword", db="mydb")
cursor = conn.cursor()
name = "John'; DROP TABLE users;"
age = 25
name = MySQLdb.escape_string(name)
cursor.execute("INSERT INTO users (name, age) VALUES ('%s', %s)" % (name, age))
conn.commit()
- Использование ORM (Object-Relational Mapping):
ORM-фреймворки, такие как SQLAlchemy или Django ORM, предоставляют абстракцию базы данных и обработку запросов безопасным способом. Они автоматически экранируют входные данные и предотвращают SQL инъекции.
Пример с использованием SQLAlchemy:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
engine = create_engine('postgresql://myuser:mypassword@localhost:5432/mydb')
Session = sessionmaker(bind=engine)
session = Session()
user = User(name='John', age=25)
session.add(user)
session.commit()
Важно отметить, что безопасность SQL запросов - это только один аспект защиты приложения от атак SQL инъекций. Дополнительные меры безопасности должны быть реализованы, такие как контроль доступа, аутентификация пользователей и проверка валидности входных данных.