چطور جلوی ایجنت AI رو بگیریم که اپ لاراول رو نابود نکنه
خلاصهٔ کاملتر
نویسنده تو این مقاله از اتفاقی شروع میکنه که سروصدای زیادی کرد: یه ایجنت کدنویسی با Claude Opus 4.6 داخل Cursor، دیتابیس پروداکشن PocketOS رو تو ۹ ثانیه پاک کرد. PocketOS یه SaaS برای شرکتهای اجارهی ماشینه. ایجنت داشت یه مشکل سادهی credential تو محیط staging رو درست میکرد که خودش تصمیم گرفت یه volume تو Railway رو پاک کنه. بازیابی دیتابیس بیشتر از ۳۰ ساعت طول کشید.
به گفتهی نویسنده، سه خطا روی هم افتادن. یکی اینکه یه توکن Railway با دسترسی کامل تو فایلی بود که ایجنت میتونست بخونه. دوم، ایجنت قانونهای پروژه رو که صریحاً میگفتن کار مخرب نکن، دید و نادیده گرفت. سوم، API شرکت Railway بدون هیچ تأییدی درخواست حذف رو قبول کرد و چون بکاپها روی همون volume بودن، اونا هم پاک شدن.
مهمترین راهحل از نظر نویسنده، قانونهای deny تو فایل .claude/settings.json ـه. تو Claude Code قانونهای deny همیشه اول بررسی میشن و هیچ allowای نمیتونه اونا رو دور بزنه. ایجنت PocketOS برای صدا زدن GraphQL API از curl استفاده کرده بود، پس یه قانون deny برای curl کل ماجرا رو متوقف میکرد. یه بخش کوتاه از نمونهی مقاله:
"deny": [
"Bash(curl:*)",
"Bash(railway:*)",
"Bash(php artisan db:wipe:*)",
"Bash(php artisan migrate:fresh:*)"
]نکتهی بعدی اینه که ایجنت هر فایلی تو پوشهی پروژه رو میتونه بخونه، از جمله .env. پس هیچوقت credential پروداکشن رو تو .env لوکال نذار و فقط مقدارهای لوکال مثل دیتابیس localhost و کلیدهای تستی Stripe رو نگه دار. اگه از Forge یا Laravel Cloud استفاده میکنی، متغیرهای پروداکشن تو UI همون سرویس میمونن. برای کلیدهایی هم که حتماً باید لوکال باشن، از توکن scoped (یعنی توکنی با کمترین دسترسی لازم) استفاده کن.
لایهی بعدی گذاشتن چک APP_ENV داخل Artisan commandهای مخربه، یعنی اگه app()->environment('production') بود، دستور اجرا نشه. این مهمه چون با --dangerously-skip-permissions یا حالت bypassPermissions، پرامپت تأیید خود لاراول هم رد میشه. نویسنده پیشنهاد میده یه connection جدا به اسم agent_readonly با یوزر MySQL که فقط دسترسی SELECT داره بسازی تا ایجنت اصلاً نتونه چیزی پاک کنه.
بقیهی لایهها: نوشتن قانونهای ایمنی تو CLAUDE.md که اجباری نیستن ولی احتمال خطا رو کم میکنن، استفاده از plan mode (یعنی حالتی که ایجنت فقط میخونه و پیشنهاد میده و هیچ چیزی اجرا نمیکنه)، و جدا نگه داشتن credentialهای CI/CD از محیط توسعه. نویسنده میگه مشکل خود AI نیست و آدما سالها قبلش هم دیتابیس پروداکشن پاک میکردن؛ ایجنت فقط سریعترش کرد.
نکات کلیدی:
- دیتابیس PocketOS تو ۹ ثانیه پاک شد و بازیابیش بیشتر از ۳۰ ساعت طول کشید.
- تو Claude Code قانون deny همیشه به allow اولویت داره.
- credential پروداکشن نباید تو هیچ فایلی باشه که ایجنت بتونه بخونه، حتی .env لوکال.
- چک APP_ENV داخل خود دستور حتی با bypassPermissions هم کار میکنه.
- یوزر دیتابیس فقط با SELECT جلوی DROP و TRUNCATE رو میگیره.
- تو Routineهای Claude Code پرامپت تأیید نیست، پس deny rule باید سختگیرانهتر باشه.




