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