راهکارهای جلوگیری از Prompt Injection و جیل‌بریک

با انواع حملات Prompt Injection و روش‌های فرار از جیل‌بریک آشنا شوید و تکنیک‌های دفاعی لایه‌به‌لایه برای وب‌اپلیکیشن‌های مبتنی بر AI را بیاموزید.

به‌زبان ساده: حملات Prompt Injection (تزریق فرمان) زمانی رخ می‌دهد که مهاجم با ورودی‌های آلوده، مدل هوش مصنوعی را وادار به نادیده گرفتن دستورهای سیستمی می‌کند. این مقاله علاوه بر شناسایی انواع جیل‌بریک، یک استراتژی دفاعی چندلایه شامل اعتبارسنجی ورودی، جداسازی دستورها، محدودسازی خروجی و پایش بلادرنگ را برای وب‌اپلیکیشن‌های مبتنی بر LLM معرفی می‌کند.

حمله Prompt Injection چیست و چرا خطرناک است؟

در معماری برنامه‌های مبتنی بر مدل‌های زبانی بزرگ (LLM)، یک سیستم معمولاً شامل دو بخش فرمان سیستمی (System Prompt) و ورودی کاربر (User Input) است. حمله Prompt Injection از این واقعیت سوءاستفاده می‌کند که مدل مرز دقیقی بین «برنامه» و «داده» قائل نیست. مهاجم با ارسال متن‌هایی مانند «قوانین قبلی را نادیده بگیر» یا «حالا به‌عنوان یک دستیار بدون محدودیت عمل کن»، تلاش دارد نحوه رفتار مدل را به‌نفع خود تغییر دهد. در وب‌اپلیکیشن‌ها، این حمله می‌تواند منجر به سوءاستفاده از ابزارهای متصل (مثل پرداخت، ارسال ایمیل یا دسترسی به پایگاه داده) شود و در موارد پیشرفته به سرقت اطلاعات حساس یا دستکاری تصمیم‌گیری‌های سیستمی ختم گردد.

انواع رایج حملات و تکنیک‌های جیل‌بریک در وب

در گذشته، تکنیک‌های جیل‌بریک در چت‌بات‌های عمومی محبوب بودند، اما امروزه حملات به سمت وب‌اپلیکیشن‌ها چرخش کرده است. یکی از روش‌های رایج «تزریق غیرمستقیم» (Indirect Prompt Injection) است که در آن کد مخرب در متن منبعی که اپلیکیشن از وب جستجو می‌کند یا از فایل آپلودی می‌خواند جاسازی می‌شود. روش دیگر «تزریق متغیرها» است که در آن پارامترهای URL، فیلدهای فرم، یا داده‌های هدر HTTP حامل دستورهای پنهان هستند. همچنین حملات «نقض نقش» (Role Deviation) و «استخراج فرمان سیستمی» (System Prompt Leaking) به مهاجم امکان می‌دهند تا منطق اصلی برنامه را کشف و دور بزند. مهاجمان از تکنیک‌های Encoded Payload، ایفای نقش (Roleplay) و استفاده هم‌زمان از چند زبان (برای دور زدن فیلترها) نیز استفاده می‌کنند.

استراتژی جامع دفاعی برای وب‌اپلیکیشن‌ها

۱. جداسازی سخت‌افزارانه (Hard Separation) و طراحی محیط ایزوله

بهترین راه مقابله با تزریق فرمان، این است که مدل هرگز به‌طور مستقیم به ابزارهای حساس دسترسی نداشته باشد. تمام درخواست‌های کاربر ابتدا توسط یک لایه میانی (Policy Engine) تفسیر می‌شود؛ این لایه نتیجه مدل را فقط یک «پیشنهاد» در نظر می‌گیرد و اجرای عملیات‌های حساس را به‌صورت صریح و با مجوزهای جداگانه انجام می‌دهد. در معماری طراحی، از ارائه‌دادن یک فرمان واحد به‌همراه کل ورودی متنی کاربر در یک ساختار، خودداری کنید. به‌جای آن، ورودی کاربر را به یک زیرسیستم جداگانه بفرستید و فقط نتیجه پردازش‌شده را به‌عنوان «داده» به مدل اصلی تحویل دهید، نه به‌عنوان «دستور». می‌توانید از الگوی Allowlist برای دستورهای مجاز و استفاده از قالب‌بندی XML/JSON با تگ‌های معنایی بهره‌بگیرید.

۲. اعتبارسنجی ورودی و فیلتر در چارچوب سیستمی

در لایه ورودی، هر پارامتری که از کاربر می‌رسد باید پیش از ورود به پرامپت، نرمال‌سازی شود: حذف کاراکترهای کنترلی، برش طول، اعتبارسنجی با Regex بر اساس نوع داده، و تبدیل هر مقدار به یک متغیر محصور. اگر اپلیکیشن مجبور به ترکیب متن آزاد با پرامپت است، بخش کاربر را در یک «ساندباکس متنی» قرار دهید و با انکودینگ و تفسیر مجدد، ساختار تماماً کنترل‌شده را برای مدل شفاف کنید. به‌کارگیری تکنیک‌های Sanitization مانند تبدیل خطوط جدید به برچسب‌های غیرفرمانی و بنابراین بی‌اثر کردن الگوهای رایج تزریق، در لایه ابتدایی تأثیر فراوانی دارد.

۳. محدودسازی خروجی و کنترل محتوای تولیدشده

پیش از بازگرداندن پاسخ مدل به کاربر یا اجرای هرگونه اکشن، خروجی را از نظر پیام‌های خطرناکی که مهاجم سعی در استخراج آن‌ها دارد اسکن کنید. برای این کار می‌توانید از ابزارهای طبقه‌بندی متن (Moderation API) استفاده کنید و اگر خروجی شامل دستوراتی برای تغییر نقش، اعلام فرمان سیستمی یا درخواست خروج از حالت عادی بود، پاسخ را بلوکه کنید. قوانین سختگیرانه‌ای برای خروجی‌ها (مانند فیلتر کلمات کلیدی مرتبط با سوءاستفاده) تعریف کنید، اما توجه داشته باشید که این قوانین به‌تنهایی کافی نیستند و به‌عنوان یک لایه در کنار سایر محافظت‌ها عمل می‌کنند.

۴. مدیریت حافظه و خنثی‌سازی جلب‌های متنی

بسیاری از حملات جیل‌بریک با استفاده از «حافظه طولانی» یا «گفتگوی چندمرحله‌ای» پیش می‌روند. در هر نوبت، بافت مکالمه را به‌صورت کامل در اختیار مدل قرار ندهید؛ به‌جای آن، خلاصه‌های تهیه‌شده با یک سیستم جداگانه و بدون امکان فرمان‌دادن به مدل را جایگزین کنید. همچنین در هر حلقه از مکالمه یک «توکن وفاداری» (Integrity Token) به مدل ارائه دهید که هر بار بیان می‌کند چه چیزی ورودی کاربر است و چه چیزی محتوای پردازش‌شده سیستم. در صورت تشخیص هر تغییری در رفتار نرمال مدل یا ناهنجاری در توکن، کاملاً جلسه را به حالت اول بازگردانید.

۵. پایش، ثبت وقایع و استفاده از جیل‌بریک‌ر اینتلیجنس

هیچ راهکاری بدون آزمایش و پایش مستمر کامل نیست. تمام پرامپت‌ها و پاسخ‌های مدل را ثبت کنید و از آنالیز الگوها برای شناسایی تلاش‌های مکرر تزریق استفاده کنید. یک ابزار «دیوار دفاعی» (Prompt Shield) بسازید که انواع تکنیک‌های شناخته‌شده مانند DAN، تکنیک فرار از فیلترها و تزریق غیرمستقیم را در یک پایگاه دانش نگهداری کند و به‌روزرسانی مستمر این پایگاه دانش از گزارش‌های امنیتی عمومی به شما کمک می‌کند تا در برابر جیل‌بریک‌های جدید به‌موقع واکنش دهید.

نتیجه‌گیری و راهکار اجرایی

امروزه غیرممکن است که فقط برای مدل یک «پرامپت امنیتی» بنویسید و انتظار داشته باشید تمام حملات دفع شوند. جیل‌بریک و تزریق فرمان یک مسئله سیستمی است که نیاز به رویکردی چندلایه دارد: این استراتژی باید شامل جدا کردن دستورات از داده، اعتبارسنجی همه ورودی‌ها، محدودیت نفوذ به ابزارها، کنترل دقیق خروجی، و پایش دائمی رفتار مدل باشد. برای پیاده‌سازی سریع، با طراحی یک لایه ارکستراسیون میان برنامه و مدل شروع کنید، هرگز به مدل اعتماد مطلق نداشته باشید، و برای تمام عملیات حساس، تأیید انسانی (Human-in-the-loop) را پیش‌بینی نمایید. امنیت یک مدل زبانی، بیش از آنکه به قدرت آن وابسته باشد، به معماری‌ای که آن را محصور کرده، گره خورده است. با پذیرش این اصل و پیاده‌سازی راهکارهای دقیق و آزمون‌شده، می‌توانید وب‌اپلیکیشن خود را در برابر این نسل جدید تهدیدات ایمن کنید.