Harden paradizweb guardrails: block outbound action requests in web bridge

This commit is contained in:
OpenClaw Assistant
2026-03-02 00:27:13 +03:00
parent a341987406
commit 67562dc49c

View File

@@ -46,6 +46,16 @@ function sanitizeForWebsite(text) {
return cleaned;
}
function isExternalActionRequest(text) {
const t = String(text || '').toLowerCase();
const markers = [
'отправ', 'напиши в telegram', 'напиши в телеграм', 'telegram', 'телеграм',
'whatsapp', 'ватсап', 'vk', 'вк', 'email', 'e-mail', 'почт', 'позвон',
'создай задачу', 'api', 'webhook', 'уведомлен'
];
return markers.some((m) => t.includes(m));
}
function json(res, code, payload) {
res.writeHead(code, {
'Content-Type': 'application/json; charset=utf-8',
@@ -65,7 +75,9 @@ function runAgent(userText) {
'Работай только по теме бронирования/подбора проживания для Парадиз.',
'Используй только логику скилла paradiz.',
'Не выполняй задачи вне бронирования и не меняй файлы.',
'Если данных не хватает для брони — задай уточняющие вопросы.'
'Если данных не хватает для брони — задай уточняющие вопросы.',
'СТРОГО ЗАПРЕЩЕНО: любые внешние действия и коммуникации (Telegram/VK/WhatsApp/email/звонки/API-вызовы/отправка сообщений/создание задач/изменения в сторонних системах).',
'Если пользователь просит внешнее действие, ответь только текстом: "Я передам информацию менеджеру, он свяжется с вами." и продолжи сбор данных по бронированию.'
].join(' ');
const message = `${guardrail}\n\nОтвечай клиенту полезно и конкретно. Не используй NO_REPLY для веб-чата. Никогда не выводи служебные техстроки (аккаунт, модель, лимиты, codex-аккаунт).\n\nВопрос клиента: ${userText}`;
@@ -117,6 +129,13 @@ const server = http.createServer(async (req, res) => {
const question = String(parsed.question || '').trim();
if (!question) return json(res, 400, { ok: false, error: 'question_required' });
if (isExternalActionRequest(question)) {
return json(res, 200, {
ok: true,
answer: 'Я передам информацию менеджеру, он свяжется с вами. А пока напишите, пожалуйста, даты заезда/выезда и состав гостей — подготовлю варианты и стоимость.'
});
}
const answer = await runAgent(question);
return json(res, 200, { ok: true, answer });
} catch (e) {