- BrainTools - https://www.braintools.ru -
Основная претензия к коду, написанному искусственным интеллектом [1], заключается в низком уровне его надежности и безопасности. Стремясь как можно быстрее выдать работающее решение, языковые модели часто пренебрегают тестами, игнорируют обработку крайних случаев и допускают критические уязвимости вроде SQL-инъекций или межсайтового скриптинга (XSS).
Модели оптимизированы под генерацию быстрых ответов. Написание тестов и аудит безопасности требуют дополнительных вычислительных ресурсов и траты контекста. Если эти требования не зафиксированы жестко в системных инструкциях, нейросеть просто пропустит их.
Эту проблему решают структурированные рабочие процессы (workflows).
В отличие от простых текстовых промптов, воркфлоу в библиотеке proagents представляют собой пошаговые алгоритмы. Они заставляют ИИ-ассистента следовать строгому регламенту в процессе написания и проверки кода.
В библиотеке содержится 521 готовый воркфлоу. Рассмотрим три ключевых сценария из разделов тестирования и безопасности с конкретными примерами реализации:
Этот воркфлоу запрещает модели писать функциональный код сразу. Он заставляет ее следовать классическому циклу 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);
}
Инструкция обязывает модель проводить анализ потенциальных угроз перед написанием кода, взаимодействующего с базой данных или обрабатывающего пользовательский ввод. Модель обязана проверить код на соответствие десяти самым критическим рискам безопасности по версии 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
});
Чек-лист готовности к релизу. Воркфлоу заставляет модель проверить качество логирования ошибок, убедиться в отсутствии захардкоженных API-ключей, проверить корректность заголовков безопасности и настроить параметры кеширования.
Для интеграции этих процессов используется 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) |
Строгая типизация и логирование сбоев |
|
Безопасность данных |
Риск утечки секретов и хардкода токенов |
Проверка переменных окружения на этапе кодинга |
Посмотрим, как меняется подход к написанию кода на примере создания функции авторизации пользователя.
Без использования воркфлоу (базовый 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');
}
});
Здесь допущены критические ошибки [2]: уязвимость к 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 для хэширования паролей, реализовать проверку наличия секретного ключа в переменных окружения, типизировать параметры и добавить безопасное логирование без раскрытия чувствительных данных.
База правил и воркфлоу proagents полностью открыта.
Ссылка на проект: github.com/Arlandaren/proagents [3]
Если библиотека помогла вам повысить безопасность и надежность ваших приложений, поддержите проект звездой на GitHub. Ваши пуллреквесты с новыми сценариями тестирования и аудита безопасности приветствуются.
Автор: alrn
Источник [4]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/31875
URLs in this post:
[1] интеллектом: http://www.braintools.ru/article/7605
[2] ошибки: http://www.braintools.ru/article/4192
[3] github.com/Arlandaren/proagents: https://github.com/Arlandaren/proagents
[4] Источник: https://habr.com/ru/articles/1048696/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1048696
Нажмите здесь для печати.