Как научить ИИ-ассистента писать тесты и моделировать угрозы безопасности в процессе кодинга. claude code.. claude code. cursor.. claude code. cursor. Open source.. claude code. cursor. Open source. owasp.. claude code. cursor. Open source. owasp. TDD.. claude code. cursor. Open source. owasp. TDD. безопасность.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект. качество кода.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект. качество кода. Программирование.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект. качество кода. Программирование. разработка.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект. качество кода. Программирование. разработка. Текстовые редакторы и IDE.. claude code. cursor. Open source. owasp. TDD. безопасность. визуальное программирование. Информационная безопасность. искусственный интеллект. качество кода. Программирование. разработка. Текстовые редакторы и IDE. тестирование.

Главная уязвимость ИИ-кодогенерации

Основная претензия к коду, написанному искусственным интеллектом, заключается в низком уровне его надежности и безопасности. Стремясь как можно быстрее выдать работающее решение, языковые модели часто пренебрегают тестами, игнорируют обработку крайних случаев и допускают критические уязвимости вроде SQL-инъекций или межсайтового скриптинга (XSS).

Модели оптимизированы под генерацию быстрых ответов. Написание тестов и аудит безопасности требуют дополнительных вычислительных ресурсов и траты контекста. Если эти требования не зафиксированы жестко в системных инструкциях, нейросеть просто пропустит их.

Эту проблему решают структурированные рабочие процессы (workflows).


Как работают исполняемые workflows в proagents

В отличие от простых текстовых промптов, воркфлоу в библиотеке proagents представляют собой пошаговые алгоритмы. Они заставляют ИИ-ассистента следовать строгому регламенту в процессе написания и проверки кода.

В библиотеке содержится 521 готовый воркфлоу. Рассмотрим три ключевых сценария из разделов тестирования и безопасности с конкретными примерами реализации:

1. Строгий цикл разработки (tdd-workflow.md)

Этот воркфлоу запрещает модели писать функциональный код сразу. Он заставляет ее следовать классическому циклу Red-Green-Refactor.

Пример TDD в действии при создании функции валидации email (Vitest / Jest):

Шаг 1: ИИ пишет тест, который падает (RED-фаза):

import { describe, it, expect } from 'vitest';
import { validateEmail } from './validator';

describe('validateEmail', () => {
  it('должен возвращать true для корректных адресов', () => {
    expect(validateEmail('test@example.com')).toBe(true);
  });

  it('должен возвращать false для некорректных адресов', () => {
    expect(validateEmail('invalid-email')).toBe(false);
    expect(validateEmail('')).toBe(false);
  });
});

Шаг 2: ИИ пишет минимальный код для прохождения тестов (GREEN-фаза):

export function validateEmail(email: string): boolean {
  if (!email) return false;
  const emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/;
  return emailRegex.test(email);
}

2. Моделирование угроз (owasp-threat-modeling.md)

Инструкция обязывает модель проводить анализ потенциальных угроз перед написанием кода, взаимодействующего с базой данных или обрабатывающего пользовательский ввод. Модель обязана проверить код на соответствие десяти самым критическим рискам безопасности по версии OWASP, выявить потенциальные точки отказа и внедрить защитные механизмы.

Шаблон таблицы моделирования угроз, который ИИ заполняет перед работой:

Компонент / Эндпоинт

Потенциальная угроза (STRIDE)

Категория OWASP

Мера предотвращения (Mitigation)

POST /api/register

SQL-инъекция через поле username

A03:2021-Injection

Использовать параметризованные запросы Prisma ORM + валидацию Zod

POST /api/register

XSS через вредоносный скрипт в поле BIO

A03:2021-Injection

Санитизация ввода через dompurify / escape-html

POST /api/register

Подбор паролей brute-force

A02:2021-Cryptographic Failures

Настройка rate-limiter (express-rate-limit) + хэширование argon2

Пример безопасной валидации с помощью Zod на основе этих мер:

import { z } from 'zod';
import escapeHtml from 'escape-html';

export const RegistrationSchema = z.object({
  username: z.string().min(3).max(30).regex(/^[a-zA-Z0-9_]+$/),
  email: z.string().email(),
  bio: z.string().max(500).transform((val) => escapeHtml(val)) // защита от XSS
});

3. Проверка перед деплоем (production-deployment.md)

Чек-лист готовности к релизу. Воркфлоу заставляет модель проверить качество логирования ошибок, убедиться в отсутствии захардкоженных API-ключей, проверить корректность заголовков безопасности и настроить параметры кеширования.


Как внедрить workflows в рабочий процесс

Для интеграции этих процессов используется CLI-инструмент библиотеки proagents.

Клонируем репозиторий:

git clone https://github.com/Arlandaren/proagents.git
cd proagents

Устанавливаем TDD и OWASP воркфлоу в Cursor:

./proagents install tdd-workflow --cursor
./proagents install owasp-threat-modeling --cursor

Теперь при выполнении сложных задач Cursor будет действовать по шагам, прописанным в воркфлоу, проверяя безопасность каждого этапа разработки.


Сравнение подходов к генерации

Критерий

Базовый AI-ассистент

С воркфлоу из proagents

Написание тестов

Редко, только по прямому запросу

Обязательно, по циклу Red-Green-Refactor

Анализ уязвимостей

Не проводится

Автоматический аудит на соответствие OWASP

Обработка ошибок

Минимальная (часто пустые блоки catch)

Строгая типизация и логирование сбоев

Безопасность данных

Риск утечки секретов и хардкода токенов

Проверка переменных окружения на этапе кодинга


Практический пример: создание API-эндпоинта

Посмотрим, как меняется подход к написанию кода на примере создания функции авторизации пользователя.

Без использования воркфлоу (базовый AI):

app.post('/api/login', async (req, res) => {
  const { username, password } = req.body;
  const user = await db.query(`SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`);
  if (user) {
    res.json({ token: 'jwt-token-placeholder' });
  } else {
    res.status(401).send('Invalid credentials');
  }
});

Здесь допущены критические ошибки: уязвимость к SQL-инъекциям (прямая конкатенация строки запроса), хранение паролей в открытом виде и плейсхолдер вместо реальной генерации токенов.

С использованием воркфлоу owasp-threat-modeling:

import { Request, Response } from 'express';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

export async function handleLogin(req: Request, res: Response): Promise<void> {
  try {
    const { username, password } = req.body;
    if (!username || !password) {
      res.status(400).json({ error: 'Missing credentials' });
      return;
    }

    const query = 'SELECT id, password_hash FROM users WHERE username = $1';
    const result = await db.query(query, [username]);
    
    if (result.rows.length === 0) {
      res.status(401).json({ error: 'Invalid credentials' });
      return;
    }

    const user = result.rows[0];
    const isPasswordValid = await bcrypt.compare(password, user.password_hash);

    if (!isPasswordValid) {
      res.status(401).json({ error: 'Invalid credentials' });
      return;
    }

    const jwtSecret = process.env.JWT_SECRET;
    if (!jwtSecret) {
      throw new Error('JWT_SECRET env variable is not defined');
    }

    const token = jwt.sign({ userId: user.id }, jwtSecret, { expiresIn: '1h' });
    res.json({ token });
  } catch (error) {
    logger.error('Login error', { error });
    res.status(500).json({ error: 'Internal server error' });
  }
}

Воркфлоу заставил модель использовать параметризованные SQL-запросы для защиты от инъекций, применить bcrypt для хэширования паролей, реализовать проверку наличия секретного ключа в переменных окружения, типизировать параметры и добавить безопасное логирование без раскрытия чувствительных данных.


Открытый исходный код под лицензией MIT

База правил и воркфлоу proagents полностью открыта.

Ссылка на проект: github.com/Arlandaren/proagents

Если библиотека помогла вам повысить безопасность и надежность ваших приложений, поддержите проект звездой на GitHub. Ваши пуллреквесты с новыми сценариями тестирования и аудита безопасности приветствуются.

Автор: alrn

Источник