FlawOpen

flawopen.com/Справочник/FastAPI SQL Injection

Защищает ли FastAPI от SQL Injection по умолчанию?

Руководство по Python и API
Короткий ответ

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

Уязвимый и безопасный шаблон FastAPI

УЯЗВИМО: интерполяция меняет SQL-текст
# Проверка типа 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()
БЕЗОПАСНО: SQLAlchemy отдельно связывает значение
# :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.

Профилактический список

Источники

См. также SQL-инъекции (CWE-89): как они работают и как их предотвратить в любом языке — flawopen.com GORM Raw SQL: защита от SQL-инъекций в Go Достаточно ли экранировать кавычки от SQL Injection? Достаточно ли ORM, чтобы предотвратить SQL-инъекции? Защищает ли Knex.js от SQL-инъекций? MyBatis ${} и #{}: защита от SQL Injection MySQLi и PDO: безопасные подготовленные запросы