Код-ревью Middle Безопасность и право обновлено
Код-ревью: скрипт отправки диффа на ИИ-ревью
Вопрос
Скрипт в CI отправляет изменения в облачную модель и публикует её замечания. Найдите проблемы.
import os, subprocess, requests
API_KEY = "sk-live-4f9a2c7e81b0"
URL = "https://api.example-llm.com/v1/chat"
def main():
diff = subprocess.check_output(["git", "diff", "origin/main"]).decode()
env = open(".env").read()
logs = open("logs/prod-errors.log").read()
prompt = f"Проверь код.\nДифф:\n{diff}\nКонфиг:\n{env}\nЛоги:\n{logs}"
r = requests.post(URL, headers={"Authorization": f"Bearer {API_KEY}"},
json={"messages": [{"role": "user", "content": prompt}]})
review = r.json()["choices"][0]["message"]["content"]
print(review)
subprocess.run(review, shell=True)
main()
Коротко
Главные проблемы в том, что уходит наружу и что выполняется. Отправлять нужно только дифф, без .env и продовых логов, ключ брать из секретов CI.
Что должен найти ревьюер
- Безопасностьстрока 3Ключ API прямо в коде: уедет в git и в логи. Брать из секретов CI через переменную окружения, этот ключ отозвать.
- Безопасностьстрока 8В промпт отправляется .env с паролями: секреты уходят внешнему провайдеру. Для ревью конфиг не нужен.
- Безопасностьстрока 9Продовые логи обычно содержат персональные данные клиентов. Отправка их в облачную модель это передача ПДн третьей стороне.
- Безопасностьстрока 15Ответ модели исполняется как shell-команда: инъекция через дифф или логи превращается в выполнение кода на раннере.
- Ошибкастрока 11Нет таймаута и проверки статуса ответа: при ошибке API скрипт упадёт на разборе JSON или повиснет.
- Производительностьстрока 7Дифф отправляется целиком без ограничения размера: большой PR упрётся в окно контекста и стоимость.
Разбор
Главные проблемы в том, что уходит наружу и что выполняется. Отправлять нужно только дифф, без .env и продовых логов, ключ брать из секретов CI. Ответ модели это текст от недоверенного источника: его публикуют комментарием, а не исполняют. Плюс обычная надёжность: таймаут, проверка статуса, лимит размера.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.