آموزش جلوگیری از حملات CSRF در FortiWeb
این مقاله نحوه جلوگیری از حملات CSRF در FortiWeb 7.6 را با توضیح مکانیزم توکن tknfv، پیکربندی کامل GUI و CLI، سناریوی عملی، تست، Troubleshooting و Best Practiceهای اجرایی آموزش میدهد.
خلاصه تخصصی مقاله
این مقاله نحوه جلوگیری از حملات CSRF در FortiWeb 7.6 را با توضیح مکانیزم توکن tknfv، پیکربندی کامل GUI و CLI، سناریوی عملی، تست، Troubleshooting و Best Practiceهای اجرایی آموزش میدهد.
موضوعات اصلی: پشتیبانی شبکه، کنید، درخواست، URL، set، List
آموزش جلوگیری از حملات CSRF در FortiWeb 7.6 با GUI و CLI
حملهCross-Site Request Forgeryیا CSRF زمانی رخ میدهد که مهاجم مرورگر یک کاربر احراز هویتشده را فریب میدهد تا بدون اطلاع او، در یک وبسایت معتبر درخواست ناخواستهای ارسال کند. چون مرورگر معمولاً کوکی نشست را بهصورت خودکار همراه درخواست میفرستد، برنامه آسیبپذیر ممکن است درخواست جعلی را مانند درخواست واقعی کاربر پردازش کند.
FortiWeb برای کاهش این ریسک، روی صفحات مشخصشده یک اسکریپت قرار میدهد تا پارامتر ضد CSRF با نامtknfvبه لینکها، فرمها و در صورت فعالبودن قابلیت مربوطه، درخواستهایXMLHttpRequestاضافه شود. سپس FortiWeb در URLهای حساس، وجود و درستی این توکن را با اطلاعات نشست کاربر بررسی میکند.
این مقاله از مرحله شناخت حمله تا طراحی Rule، پیکربندی در GUI و CLI، تست، عیبیابی و انتقال امن از حالتمانیتورینگبه حالت Block را توضیح میدهد تا برای ادمینهای تازهکار و کارشناسان باتجربه قابل استفاده باشد.
این مقاله بر اساسFortiWeb 7.6نوشته شده است. در نسخههای دیگر ممکن است مسیرهای GUI، نام فیلدها یا رفتار برخی قابلیتها متفاوت باشد.
tknfvبه درخواستهای مبتنی برXMLHttpRequestاست.مروری بر این مقاله
- حمله CSRF چیست و چگونه اجرا میشود؟
- FortiWeb چگونه از درخواستها محافظت میکند؟
- پیشنیازها و محدودیتهای مهم
- طراحی Page List و URL List
- سناریوی نمونه کانفیگ
- پیکربندی CSRF در GUI
- پیکربندی CSRF در CLI
- استفاده از Parameter Filter
- روش تست و اعتبارسنجی
- خطاهای رایج و Troubleshooting
- Best Practiceهای عملیاتی
- چکلیست اجرایی
1. حمله CSRF چیست و چگونه اجرا میشود؟
فرض کنید کاربر وارد پنل بانکی، سامانه سازمانی یا پرتال مدیریت شده و کوکی نشست معتبر در مرورگر او وجود دارد. مهاجم لینکی برای کاربر ارسال میکند یا کدی را در یک سایت دیگر قرار میدهد که مرورگر قربانی را وادار میکند در پسزمینه درخواستی به سامانه هدف ارسال کند. اگر برنامه فقط به کوکی نشست اعتماد کند و منشأ یا توکن اختصاصی درخواست را بررسی نکند، ممکن است عملیات ناخواسته اجرا شود.
نمونه اثرهای احتمالی
- تغییر ایمیل، شماره تماس یا گذرواژه حساب کاربری
- ایجاد کاربر، تغییر سطح دسترسی یا حذف یک رکورد
- ثبت تراکنش، انتقال وجه یا تغییر اطلاعات پرداخت
- فعال یا غیرفعالکردن یک قابلیت مدیریتی
- ارسال درخواست از طرف کاربر بدون اطلاع او
بر اساس راهنمای OWASP، دفاع اصلی باید در خود برنامه شامل توکن ضد CSRF، کنترل مجدد مجوزها و طراحی صحیح نشست باشد. FortiWeb یک لایه دفاعی تکمیلی در جلوی برنامه ایجاد میکند و نباید جایگزین کنترلهای امنیتی داخل Application در نظر گرفته شود.
2. FortiWeb چگونه از درخواستها محافظت میکند؟
قابلیت CSRF Protection در FortiWeb بر اساس ارتباط میان دو فهرست کار میکند
| فهرست | وظیفه | نمونه |
|---|---|---|
| Page List Table | صفحاتی که FortiWeb باید اسکریپت افزودن توکن را در پاسخ HTML آنها قرار دهد. | /account/profile |
| URL List Table | URLهایی که درخواست به آنها باید دارای توکن معتبرtknfvباشد. | /api/account/email |
هنگامی که کاربر صفحهای از Page List را دریافت میکند، FortiWeb در پاسخ HTML اسکریپتی قرار میدهد که مقدارtknfvرا به لینکها و فرمهای صفحه اضافه میکند. مقدار توکن با کوکی صادرشده توسط Client Management مرتبط است. وقتی مرورگر درخواستی به یکی از URLهای موجود در URL List ارسال میکند، FortiWeb مقدار توکن و نشست را بررسی میکند.
اگر توکن وجود نداشته باشد یا با مقدار مورد انتظار نشست تطبیق نکند، FortiWeb بر اساس Action تنظیمشده میتواند فقط Log ایجاد کند، درخواست را مسدود کند، بدون Log آن را رد کند یا برای یک بازه زمانی Client را Block کند.
محافظت از درخواستهای AJAX در FortiWeb 7.6
در FortiWeb 7.6 امکان افزودن توکن به درخواستهای JavaScript مبتنی برXMLHttpRequestوجود دارد. برای این کار باید گزینهJS Request StatusیاAjaxcheck Statusفعال باشد. مستند رسمی بهطور مشخص از تابع بومیXMLHttpRequestنام میبرد؛ بنابراین در برنامههایی که ازfetchکتابخانههای سفارشی، WebSocket، Mobile Client یا API Clientهای بدون مرورگر استفاده میکنند، حتماً رفتار واقعی برنامه را آزمایش کنید.
3. پیشنیازها و محدودیتهای مهم
پیشنیازهای اصلی
- ترافیک باید از یکInline Protection Profileعبور کند.
- Client Managementدر Web Protection Profile فعال باشد.
- Web Protection Profile موردنظر روی Server Policy فعال و در مسیر واقعی ترافیک باشد.
- صفحات Page List و درخواستهای URL List دقیقاً با جریان واقعی برنامه تطبیق داده شوند.
- در صورت استفاده از Host Status، ابتدا Protected Host مربوط به دامنه یا IP تعریف شده باشد.
محدودیت حالت استقرار
طبق مستندFortinetاین قابلیت در حالتهایOffline ProtectionوTransparent Inspectionپشتیبانی نمیشود. علت عملیاتی این محدودیت آن است که FortiWeb برای این مکانیزم باید پاسخ HTML را تغییر دهد و کوکی نشست موردنیاز Client Management را مدیریت کند.
4. طراحی Page List و URL List
مهمترین بخش کانفیگ، شناخت Flow واقعی برنامه است. قبل از ساخت Rule مشخص کنید هر عملیات حساس از کدام صفحه آغاز میشود و به کدام Endpoint درخواست میفرستد.
| سؤال طراحی | پاسخ موردنیاز |
|---|---|
| کاربر از کدام صفحه عملیات را شروع میکند؟ | این URL معمولاً باید در Page List قرار بگیرد. |
| فرم یا JavaScript درخواست را به کدام URL میفرستد؟ | این Endpoint معمولاً باید در URL List قرار بگیرد. |
| آیا صفحه و Endpoint یک URL مشترک دارند؟ | از Parameter Filter برای تفکیک درخواست نمایش صفحه و درخواست عملیاتی استفاده کنید. |
| آیا Endpoint توسط Mobile App یا API Client نیز مصرف میشود؟ | Scope را با Host، URL و Parameter Filter محدود کنید یا Flow جداگانهای طراحی کنید. |
| آیا درخواست با XMLHttpRequest ارسال میشود؟ | JS Request Status یا Ajaxcheck Status را فعال و نتیجه را در Browser DevTools بررسی کنید. |
Simple String یا Regular Expression؟
برای URLهای مشخص و ثابت ازSimple Stringاستفاده کنید. استفاده بیدلیل از Regular Expression میتواند Scope Rule را بیش از حد گسترده کند و احتمال False Positive را افزایش دهد. Regular Expression زمانی مناسب است که ساختار URL متغیر است و الگوی آن دقیقاً شناخته شده باشد.
5. سناریوی نمونه کانفیگ
در این سناریو، کاربر از صفحه پروفایل وارد فرم تغییر ایمیل میشود و فرم یک درخواست POST به Endpoint تغییر ایمیل ارسال میکند
| مورد | مقدار نمونه |
|---|---|
| دامنه برنامه | portal.example.com |
| صفحه آغاز عملیات | /account/profile |
| Endpoint حساس | /api/account/email |
| نام Rule | PARTIAN-CSRF |
| اقدام اولیه | Alert |
| اقدام پس از Tune | Alert & Deny |
در مرحله اول Rule را روی Alert قرار میدهیم تا درخواستهای واقعی، Endpointهای فراموششده و Clientهای غیرمرورگری مشخص شوند. پس از بررسی Logها و رفع False Positiveها، Action به Alert & Deny تغییر میکند.
6. پیکربندی CSRF در GUI
مرحله اول: ساخت CSRF Protection Rule
- رویCreate Newکلیک کنید.
- در قسمت Name مقدارPARTIAN-CSRFرا وارد کنید.
- در شروع Tune، Action را رویAlertقرار دهید.
- Severity را متناسب با سیاست Log سازمان انتخاب کنید؛ برای شروع مقدارMediumمناسب است.
- در صورت نیاز Trigger Action را برای ارسال Alert یا اجرای Trigger Policy انتخاب کنید.
- برای برنامههای دارای درخواست AJAX مبتنی بر XMLHttpRequest، گزینهJS Request StatusیاAjaxcheck Statusرا فعال کنید.
- تنظیمات را ذخیره کنید.
مرحله دوم: افزودن صفحه به Page List Table
در داخل Rule و در بخشPage List TableرویCreate Newکلیک کنید و مقادیر زیر را وارد کنید
| فیلد | مقدار پیشنهادی سناریو |
|---|---|
| Host Status | در صورت وجود چند Host روی یک Policy فعال شود؛ در سناریوی ساده میتواند غیرفعال باشد. |
| Host | portal.example.comیا نام Protected Host از قبل ساختهشده |
| Request Type | Simple String |
| Full URL | /account/profile |
| Parameter Filter | برای این سناریو غیرفعال |
مرحله سوم: افزودن Endpoint به URL List Table
در بخشURL List TableرویCreate Newکلیک کنید
| فیلد | مقدار پیشنهادی سناریو |
|---|---|
| Host Status | مشابه Page List و متناسب با معماری Host |
| Request Type | Simple String |
| Full URL | /api/account/email |
| Parameter Filter | در صورت نیاز برای محدودکردن Match فعال شود. |
مرحله چهارم: فعالکردن Rule در Inline Protection Profile
- Profile متصل به Server Policy برنامه را Edit کنید.
- Client Managementرا فعال کنید.
- در فیلدCSRF ProtectionRule با نامPARTIAN-CSRFرا انتخاب کنید.
- Profile را ذخیره کنید.
- اطمینان حاصل کنید همین Web Protection Profile در Server Policy فعال برنامه استفاده شده است.
7. پیکربندی CSRF در CLI
ساخت Rule در حالت Alert
config waf csrf-protection edit "PARTIAN-CSRF" set action alert set severity Medium set ajaxcheck enable config csrf-page-list edit 1 set request-url "/account/profile" set request-type plain next end config csrf-url-list edit 1 set request-url "/api/account/email" set request-type plain next end next end
در CLI مقدارplainمعادل Simple String و مقدارregularمعادل Regular Expression است. گزینهajaxcheck enableبرای افزودن توکن به درخواستهای XMLHttpRequest استفاده میشود.
اتصال Rule به Inline Protection Profile
config waf web-protection-profile inline-protection edit "PARTIAN-INLINE-PROFILE" set client-management enable set csrf-protection "PARTIAN-CSRF" next end
نامPARTIAN-INLINE-PROFILEرا با نام واقعی Web Protection Profile متصل به Server Policy جایگزین کنید.
محدودکردن Rule به Protected Host
اگر یک Profile برای چند دامنه استفاده میشود، بهتر است Page List و URL List را به Protected Host مشخص محدود کنید. نام Host باید از قبل در Protected Host Names تعریف شده باشد.
config waf csrf-protection edit "PARTIAN-CSRF" config csrf-page-list edit 1 set host-status enable set host "portal.example.com" set request-url "/account/profile" set request-type plain next end config csrf-url-list edit 1 set host-status enable set host "portal.example.com" set request-url "/api/account/email" set request-type plain next end next end
تغییر Action به Alert & Deny پس از Tune
config waf csrf-protection edit "PARTIAN-CSRF" set action alert_deny next end
گزینههای Action در CLI
| مقدار CLI | رفتار |
|---|---|
| alert | درخواست پذیرفته میشود و در صورت فعالبودن Log یا Alert، رویداد ثبت میشود. |
| alert_deny | درخواست Block میشود و Log یا Alert تولید میشود. |
| deny_no_log | درخواست بدون تولید Log رد میشود. |
| block-period | Client برای بازه 1 تا 3600 ثانیه Block میشود؛ مقدار پیشفرض CLI برای Block Period برابر 600 ثانیه است. |
8. استفاده از Parameter Filter
گاهی URL نمایش صفحه و URL دریافت فرم یکسان است. برای مثال درخواست GET به/post.aspصفحه را نمایش میدهد و درخواست POST به همان URL فایل را آپلود میکند. در این وضعیت FortiWeb باید تشخیص دهد کدام درخواست برای تزریق JavaScript و کدام درخواست برای بررسی توکن است.
Parameter Filter امکان میدهد Match علاوه بر URL، بر اساس یک پارامتر موجود در Query String یا HTTP Body انجام شود. در مثال زیر، وجود پارامترSUB1با هر مقداری نشان میدهد که درخواست مربوط به Submit فرم است
config waf csrf-protection edit "PARTIAN-CSRF-UPLOAD" set action alert config csrf-page-list edit 1 set request-url "/post.asp" set request-type plain next end config csrf-url-list edit 1 set request-url "/post.asp" set request-type plain set parameter-filter enable set parameter-name "SUB1" set parameter-value-type regular set parameter-value "*" next end next end
9. روش تست و اعتبارسنجی
مرحله اول: تست تزریق توکن
- Rule را ابتدا روی Alert قرار دهید.
- با یک Browser جدید یا Private Window وارد برنامه شوید تا نشست تازه ساخته شود.
- صفحه/account/profileرا از مسیر FortiWeb باز کنید.
- در Browser DevTools، تب Network را باز کنید.
- فرم تغییر ایمیل را ارسال کنید.
- در Request مربوط به/api/account/emailوجود پارامتر
tknfvرا در Query String یا Request Body بررسی کنید.
مرحله دوم: تست تطبیق توکن
- یک درخواست سالم را با ابزار تست مجاز سازمان یا Browser DevTools ثبت کنید.
- در محیط آزمایش، همان درخواست را بدون پارامتر
tknfvیا با مقدار تغییرکرده ارسال کنید. - در حالت Alert باید درخواست عبور کند اما Attack Log مربوط به CSRF ایجاد شود.
- پس از فعالکردن Alert & Deny، همان درخواست ناقص باید Block شود.
مرحله سوم: تست Flowهای جانبی
- تمام دکمهها و فرمهای صفحه، نه فقط مسیر اصلی، آزمایش شوند.
- درخواستهای AJAX در Chrome، Firefox و Edge بررسی شوند.
- Login مجدد، Session Timeout، Logout و بازکردن صفحه در Tab جدید آزمایش شود.
- Mobile App، API Client، Integration و Jobهای خودکار که Endpoint یکسان را مصرف میکنند تست شوند.
- در صورت وجود CDN، Reverse Proxy یا Load Balancer جلوی FortiWeb، مسیر واقعی کوکی و Host Header بررسی شود.
10. خطاهای رایج و Troubleshooting
| نشانه | علت محتمل | اقدام پیشنهادی |
|---|---|---|
| توکنtknfvبه درخواست اضافه نمیشود. | صفحه با Page List Match نشده، Client Management غیرفعال است یا پاسخ HTML شرایط لازم را ندارد. | URL، Host، نوع Match و فعالبودن Client Management را بررسی کنید. |
| فرم سالم پس از فعالکردن Block قطع میشود. | Endpoint در URL List است اما صفحه مبدأ در Page List وجود ندارد یا کاربر Endpoint را مستقیم فراخوانی میکند. | Flow را کامل Mapping کنید و Rule را با Host یا Parameter Filter محدود کنید. |
| درخواست AJAX بدون توکن است. | JS Request Status/Ajaxcheck غیرفعال است یا برنامه از سازوکاری غیر از native XMLHttpRequest استفاده میکند. | گزینه را فعال و نوع واقعی Request API را در DevTools بررسی کنید. |
| FortiWeb اسکریپت را در صفحه قرار نمیدهد. | پاسخ HTML معتبر نیست، تگهایوجود ندارند، Status Code برابر 200 نیست یا پاسخ فشرده است. | ساختار پاسخ، کد 200 و Uncompress Policy را بررسی کنید. |
| صفحه بزرگ محافظت نمیشود. | مقدار Maximum Body Cache Size از اندازه صفحه کوچکتر است. | اندازه پاسخ را اندازهگیری و مقدار Body Cache را متناسب تنظیم کنید. |
| روی یک دامنه درست و روی دامنه دیگر False Positive وجود دارد. | Profile مشترک است و Rule فقط بر اساس URL Match میشود. | Host Status را فعال و Protected Host صحیح را انتخاب کنید. |
| API Client یا Mobile App Block میشود. | Client غیرمرورگری صفحه HTML را دریافت نمیکند و در نتیجه توکن FortiWeb را ندارد. | Endpoint مشترک را از Scope عمومی خارج نکنید؛ ابتدا معماری را تفکیک یا Match را دقیقتر کنید. |
شرایط رسمی Fortinet برای تزریق صحیح اسکریپت
- نوع صفحه باید HTML باشد و تگهایورا داشته باشد.
- HTTP Response Code صفحه باید200 OKباشد.
- برای پاسخ فشرده، Uncompress Policy متناظر تنظیم شده باشد.
- مقدار Maximum Body Cache Size از اندازه صفحه بزرگتر باشد.
11. Best Practiceهای عملیاتی
- از Alert شروع کنیدابتدا رفتار واقعی سامانه را مشاهده و سپس Block را فعال کنید.
- Scope را کوچک نگه داریدفقط عملیاتهای State-Changing و حساس را وارد URL List کنید.
- Page و URL را مستند کنیدبرای هر Endpoint حساس، صفحه یا Flow تولیدکننده درخواست مشخص باشد.
- Host Status را در محیط Multi-Tenant فعال کنیدURL مشابه در دامنههای مختلف نباید ناخواسته Match شود.
- Regex را محدود کنیدSimple String برای URL ثابت امنتر و قابلپیشبینیتر است.
- Clientهای غیرمرورگری را فراموش نکنیدMobile App، Integration و API Client ممکن است توکن تزریقشده به HTML را دریافت نکنند.
- همه Browserها را تست کنیدJavaScript، Cookie Policy و Extensionهای مرورگر میتوانند روی Flow اثر بگذارند.
- Application-Level CSRF را حفظ کنیدتوکن داخلی Framework، SameSite Cookie، کنترل Origin/Referer و Authorization را حذف نکنید.
- Log و Trigger را فعال کنیدبدون Log کافی، Tune و تشخیص False Positive دشوار میشود.
- پس از تغییر برنامه Regression Test انجام دهیدتغییر Frontend، Form Action یا API Route میتواند Mapping قبلی را نامعتبر کند.
12. چکلیست اجرایی
- نسخه و Build دقیق FortiWeb ثبت شده است.
- Deployment Mode از CSRF Protection پشتیبانی میکند.
- Server Policy و Inline Protection Profile صحیح شناسایی شدهاند.
- Client Management فعال است.
- تمام Pageهای تولیدکننده درخواست حساس شناسایی شدهاند.
- تمام Endpointهای نیازمند توکن در URL List قرار گرفتهاند.
- Host Status در محیط چنددامنهای بررسی شده است.
- برای URLهای مشترک، Parameter Filter طراحی شده است.
- JS Request Status/Ajaxcheck برای XMLHttpRequest بررسی شده است.
- Rule ابتدا در حالت Alert آزمایش شده است.
- وجودtknfvدر درخواست سالم تأیید شده است.
- درخواست بدون توکن در Log شناسایی شده است.
- مرورگرها، Mobile Appها و Integrationها Regression Test شدهاند.
- پس از Tune، Action به Alert & Deny تغییر کرده است.
- Attack Log و Trigger Policy مانیتور میشوند.
- مستندات Application Flow پس از هر Release بهروزرسانی میشوند.
برای ارزیابی پایداری، امنیت و نگهداری این زیرساخت، راهنمایپشتیبانی شبکهرا نیز مطالعه کنید.