flawopen.com/Справочник/FastAPI SQL Injection
Защищает ли FastAPI от SQL Injection по умолчанию?
Pydantic проверяет, соответствует ли значение объявленному типу; он не переписывает SQL и не превращает строку Python в параметр базы данных. Проверенная строка name: str всё ещё контролируется вызывающей стороной. Представьте проверку как сверку маркировки посылки: она подтверждает тип полученного значения, а параметризация удерживает это значение отдельно от SQL-инструкций. Оставляйте шаблон запроса неизменным и передавайте значения отдельно через SQLAlchemy.
Уязвимый и безопасный шаблон FastAPI
# Проверка типа string не делает ввод безопасным внутри синтаксиса SQL
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text(f"SELECT * FROM users WHERE name = '{name}'")
return db.execute(query).fetchall()
# :name — параметр; значение передаётся отдельно
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text("SELECT * FROM users WHERE name = :name")
return db.execute(query, {"name": name}).fetchall()
Чего не обеспечивает параметризация
Параметр представляет значение, а не имя таблицы или столбца, оператор SQL либо направление сортировки. Если запрос должен выбирать поле сортировки, сопоставьте выбор с фиксированным списком разрешённых выражений столбцов SQLAlchemy; никогда не вставляйте строку запроса напрямую в SQL. Параметризация также не заменяет авторизацию: ограничьте строки, доступные пользователю, и выдайте учётной записи базы данных только права, необходимые этому endpoint.
Профилактический список
- ✓Не интерполируйте данные запроса в
text()SQLAlchemy или в строку, напрямую исполняемую базой. - ✓Используйте именованные параметры и передавайте их значения отдельно, например
db.execute(query, {"name": name}). - ✓Для динамического выбора таблицы, столбца или сортировки сопоставляйте ввод с фиксированным списком известных выражений SQLAlchemy.
- ✓Отдельно проверяйте права на чтение строк и выдавайте учётной записи базы только необходимые endpoint права.
- ✓Отдавайте предпочтение выражениям SQLAlchemy
select(), когда они подходят; ORM не делает уязвимый raw SQL безопасным.
Источники
- FastAPI — реляционные SQL-базы данных
- SQLAlchemy — передача параметров и текстовый SQL
- OWASP — предотвращение SQL Injection