Код-ревью Middle Проверка сгенерированного кода спрашивают часто обновлено

Код-ревью: эндпоинт поиска от ассистента

Вопрос

Ассистент написал эндпоинт поиска заказов на FastAPI. Найдите проблемы.

import sqlite3
from fastapi import FastAPI
from fastapi_pagination_plus import paginate

app = FastAPI()
DB_PASSWORD = "Pr0d-2024!"

@app.get("/orders/search")
def search(q: str, user_id: int, page: int = 1):
    conn = sqlite3.connect("orders.db")
    rows = conn.execute(
        f"SELECT * FROM orders WHERE title LIKE '%{q}%' AND user_id = {user_id}"
    ).fetchall()
    try:
        total = len(rows) / page
    except Exception:
        pass
    return paginate(rows, page)

Коротко

Типичный набор ошибок ИИ-кода: правдоподобный, но непроверенный пакет, секрет в коде, SQL через f-строку, доверие идентификатору из запроса, работа со всеми строками в памяти и проглоченные ошибки. Каждая по отдельности ловится чек-листом: зависимости, секреты, SQL, права, объёмы, ошибки.

Что должен найти ревьюер

  1. Безопасностьстрока 3
    Незнакомый пакет: возможно выдуманное имя или ловушка в реестре. Проверить, что он существует и нужен, или сделать пагинацию сами.
  2. Безопасностьстрока 6
    Пароль прямо в коде. Брать из окружения или хранилища секретов, ключ уже скомпрометирован, если попал в репозиторий.
  3. Безопасностьстрока 9
    user_id берётся из параметра запроса: любой может читать чужие заказы. Пользователя брать из сессии или токена.
  4. Безопасностьстрока 12
    f-строка в SQL: инъекция через q. Нужен параметризованный запрос с плейсхолдерами.
  5. Производительностьстрока 11
    Выбираются все строки и пагинация делается в памяти. Нужны LIMIT и OFFSET или курсор в самом запросе.
  6. Ошибкастрока 16
    Пустой except прячет ошибки, а сама переменная total бессмысленна и не используется. Удалить или посчитать через COUNT.
  7. Ошибкастрока 10
    Соединение с базой не закрывается. Использовать контекстный менеджер или общий пул.

Разбор

Типичный набор ошибок ИИ-кода: правдоподобный, но непроверенный пакет, секрет в коде, SQL через f-строку, доверие идентификатору из запроса, работа со всеми строками в памяти и проглоченные ошибки. Каждая по отдельности ловится чек-листом: зависимости, секреты, SQL, права, объёмы, ошибки.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.