Код-ревью 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.

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

  1. Безопасностьстрока 3
    Ключ API прямо в коде: уедет в git и в логи. Брать из секретов CI через переменную окружения, этот ключ отозвать.
  2. Безопасностьстрока 8
    В промпт отправляется .env с паролями: секреты уходят внешнему провайдеру. Для ревью конфиг не нужен.
  3. Безопасностьстрока 9
    Продовые логи обычно содержат персональные данные клиентов. Отправка их в облачную модель это передача ПДн третьей стороне.
  4. Безопасностьстрока 15
    Ответ модели исполняется как shell-команда: инъекция через дифф или логи превращается в выполнение кода на раннере.
  5. Ошибкастрока 11
    Нет таймаута и проверки статуса ответа: при ошибке API скрипт упадёт на разборе JSON или повиснет.
  6. Производительностьстрока 7
    Дифф отправляется целиком без ограничения размера: большой PR упрётся в окно контекста и стоимость.

Разбор

Главные проблемы в том, что уходит наружу и что выполняется. Отправлять нужно только дифф, без .env и продовых логов, ключ брать из секретов CI. Ответ модели это текст от недоверенного источника: его публикуют комментарием, а не исполняют. Плюс обычная надёжность: таймаут, проверка статуса, лимит размера.

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

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