WAF و حفاظت از تزریق
1) چرا WAF در دوران API
حتی با اعتبار سنجی دقیق و پارامتری، تزریق به علت:- «دم های طولانی» ادغام (کد میراث، وب سایت های وابسته)،
- اختلاف تجزیه (چارچوب ↔ پروکسی)،
- پروتکل جدید/تکنیک های بای پس مبهم.
- WAF قبل از انتشار کد، مرز انکار اولیه و «پچ مجازی» را می دهد، اما توسعه امن را جایگزین نمی کند.
2) مدل تهدید: انواع تزریق API
SQLi/ORMi: کلاسیک/بولین/مبتنی بر زمان/انباشته ؛ کور از تاخیر
NoSQLi (Mongo/Elastic): اپراتورها '$ ne/$ gt'، تزریق JSON، regex-DoS.
Command Injection/RCE: shell metacharacters, argument substitution, unsafe deserialization → code exec.
XXE: موجودیت های خارجی/DTD ها در XML.
SSRF: دسترسی به 169. 254. 169. 254 "/خدمات داخلی ؛ DNS-rebinding
تزریق قالب: Jinja/Thymeleaf/فرمان ؛ '{{77}}'.
LDAP/EL تزریق، XPath، تزریق سربرگ (CRLF)، مسیر عبور.
GraphQL-specific: دروننگری «طرحوارهی __»، عمق/پیچیدگی پرسوجوها.
JSON/JS-specific: آلودگی نمونه اولیه ('__ proto __'، 'سازنده').
gRPC/Protobuf: پیام های بزرگ، قاچاق زمینه از طریق عدم تطابق طرح.
3) معماری WAF
محیط CDN-WAF: فیلتر سریع جغرافیایی/ASN، کنترل ربات پایه، کش/ضد پوشش.
محیط L7 (NGINX/Envoy/APISIX/Kong): تجزیه دقیق، قوانین عمیق، ادغام با PDP/محدودیت ها.
Sidecar/mash (نماینده WASM/Filter): در هر سرویس، نزدیک به داده ها، مثبت کاذب کمتر برای API های داخلی.
توصیه: مدل دو لایه (CDN-WAF + L7 WAF).
4) تجزیه، عادی سازی و ضد دور زدن
WAF باید همان نمایندگی متعارف را به عنوان برنامه ببیند:- عادی سازی مسیر ('/a/% 2e% 2e/b '→ خرابی)،' UTF-8 '/Unicode confusables، بایت های NUL.
- رمزگشایی تنها: URL-/HTML-/Unicode-/Base64-layers، ممنوعیت رمزگشایی دوگانه.
- محدودیت ها: 'max _ headers'، 'max _ header _ size'، 'max _ body _ size'، 'max _ args'، عمق JSON، محدودیت چند بخشی، بمب های 2x gzip/zip ممنوع است.
- سیاستهای نوع محتوا: 'application/json' فقط در نقاط پایانی JSON ؛ «چندزبانه» را رد کنید.
5) مدل های قانون
منفی (امضا): OWASP CRS (SQLi/XSS/SSRF/جاوا/گره RCE، و غیره). شروع سریع
مثبت (اجازه لیست): طرح های سختگیرانه (JSON Schema/Protobuf)، انواع و محدوده ها ؛ در جاده ها
غیر طبیعی/به ثمر رساند: جمع نشانه های «مشکوک» → آستانه مسدود کردن.
متنی: پروفایل های مختلف برای «POST/پرداخت» و «GET/وضعیت» ؛ FP کمتر
6) واحدهای حفاظت (در یک بسته نرم افزاری)
1. طرح ها و انواع: اعتبار سنجی JSON Schema/Protobuf به منطق کسب و کار.
2. پارامتری کردن: عبارات آماده، پیوندهای ORM، ممنوعیت الحاق.
3. خروجی فرار: HTML/JS/SQL متنی.
4. سیاست های بدن: محتوا نوع، اندازه، محدودیت های چند بخشی، ممنوعیت باینری در دسته JSON.
5. قوانین WAF: CRS + سفارشی منفی/مثبت.
6. نرخ/سهمیه/همزمانی: سرکوب DDoS وحشیانه/لاک پشت، captchas محافظ/چالش برای اشکال عمومی.
7. جداسازی شبکه: سیاست های خروجی برای SSRF (انکار سوکت های RFC1918/metadata/Unix).
8. Headers-hygiene: 'X-Content-Type-Options: nosniff', 'Content-Security-Policy' for front, 'Referrer-Policy'.
9. گارد GraphQL: محدودیت عمق/پیچیدگی، ممنوعیت خودآزمایی در prod (یا role-gate).
7) نمونه های پیکربندی
7. 1 NGINX + ModSecurity (OWASP CRS)
nginx load_module modules/ngx_http_modsecurity_module.so;
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
modsecurity_rules '
SecRuleEngine On
Подключаем CRS
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/.conf
Позитивные правила: только JSON и ограничение размера
SecRule REQUEST_HEADERS:Content-Type "!@rx ^application/json($;)" "id:10001,phase:1,deny,status:415,msg:'Only JSON allowed'"
SecRequestBodyLimit 1048576
SecRequestBodyNoFilesLimit 1048576
Блок локальных адресов (SSRF)
SecRule REQUEST_HEADERS:Host "@ipmatch 127.0.0.0/8 10.0.0.0/8 169.254.0.0/16 192.168.0.0/16" \
"id:10002,phase:1,deny,status:403,msg:'Blocked private range'"
';
server {
listen 443 ssl http2;
server_name api.example.com;
client_max_body_size 1m;
proxy_request_buffering on; # защита от slow-POST proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
location /v1/ {
proxy_pass http://app_backends;
}
}
7. 2 نماینده HTTP WAF (WASM + JSON Schema + SSRF خروج از انکار)
yaml http_filters:
- name: envoy.filters.http.wasm typed_config:
config:
vm_config: { vm_id: waf, code: { local: { filename: /plugins/waf.wasm } } }
configuration:
"@type": type.googleapis.com/google.protobuf.Struct value:
crs_profile: "strict"
deny_patterns: ["(?i)union.select", "(?i)(sleep benchmark)\\s\\("]
json_schema:
"/v1/payments:create": "/schemas/payments_create.json"
- name: envoy.filters.http.router
Egress SSRF guard (L4): deny private ranges from gateway filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy typed_config:
stat_prefix: egress cluster: internet access_log: [...]
tunneling_config:
hostname: "%REQ(:authority)%"
transport_socket:
name: envoy.transport_sockets.tls
7. 3 APISIX: محدودیت نوع و ضد انسداد
yaml routes:
- uri: /v1/
plugins:
cors: { allow_origins: "https://app.example.com" }
request-validation:
body_schema:
{"type":"object","properties":{"amount":{"type":"number","minimum":1}},"required":["amount"]}
uri-blocker:
block_rules: ["..","%2e%2e","%2f..","\\x00"] # traversal/NULL proxy-rewrite:
headers:
set:
X-Content-Type-Options: "nosniff"
8) تنظیم و کاهش مثبت کاذب (FP)
پروفایل های مسیر: قوانین سختگیرانه تنها در صورت لزوم (به عنوان مثال "/جستجو "اجازه میدهد "/"%").
سایه/گزارش فقط: ورود به سیستم پاسخ قبل از بلوک ؛ مقایسه A/B معیارها.
سفارشی اجازه می دهد لیست برای پارامترهای مشروع «پر سر و صدا».
امتیاز دهی: بلوک تنها زمانی که مجموع شاخص> آستانه.
آزمایشات: درصد کمی از ترافیک به قوانین جدید → بازگشت خودکار.
9) قابلیت مشاهده و بروز
Метрики: 'waf _ block _ total {rule}', 'waf _ anomaly _ score', 'request _ body _ rejected _ total', 'schema _ violation _ total', 'ssrf _ block _ total'.
سیاهههای مربوط (نمونه برداری): قانون، بخشی از درخواست (ویرایش شده)، 'ردیابی _ id'، 'مستاجر'، 'مسیر'، دلیل. پنهان کردن PII/اسرار
داشبورد: قوانین/مسیرهای بالا، خوشه های FP، پویایی پس از انتشار.
حوادث: صرفه جویی در مصنوعات (payload، pcap در صورت لزوم)، محصولات RCA و «تکه های مجازی».
10) سناریوهای تست و هرج و مرج
محفظه های بای پس WAF (SQLi/XSS/SSRF)، رمزگذاری های ترکیبی یونیکد دو یا سه گانه.
تفاوت تجزیه: ارسال payload، که در آن پروکسی و چارچوب می تواند واگرا (تکراری پارامتر، آرایه ها، '؛ در مقابل' & ').
Slow-POST/oversize، بمب های زیپ، فرم های چند بخشی، مرز اشتباه.
GraphQL: تولید کننده عمق/پیچیدگی، محدودیت های چک کردن و زمان بندی.
11) ضد گلوله
پرش از «Content-Type »/charset checks → حملات چند زبانه
«CRS را روشن کرد و فراموش کرد»: بدون طرح، بدون تنظیم در طول مسیرها.
سیاهههای مربوط با بدن درخواست خام و PII.
بدون محدودیت نرمالیزاسیون/اندازه → دور زدن، DoS برای تجزیه.
بدون فیلترهای خروج → SSRF به ابرداده ابر.
یک پروفایل مشترک برای API های خارجی و داخلی.
استثنائات کنترل نشده «برای شریک» → سوراخ در محیط.
12) مشخصات iGaming/امور مالی
پروفایل های تقویت شده در دسته های پرداخت/خروجی: محدودیت های بدن کوچک، طرح های سختگیرانه، لیست های انکار برای زمینه های حساب/IBAN/PAN (پوشش، چک های فرمت).
Webhooks از PSP/KYC: امضای HMAC/TLS متقابل، پروفایل های WAF فردی، ضد پخش.
فیلترهای Geo/ASN و محدودیت های رفتاری برای جلوگیری از ثبت نام ربات و سوء استفاده از پاداش.
سیاهههای مربوط به حادثه تغییر ناپذیر (حسابرسی)، ذخیره سازی توسط صلاحیت.
13) تولید لیست آمادگی
- WAF دو لایه (CDN + L7)، نرمال سازی تک و محدودیت اندازه.
- OWASP CRS فعال، قوانین سفارشی در هر مسیر ؛ JSON طرح/Protobuf در قلم نوشتن.
- سیاست های محتوا/نوع charset ؛ disallow double decoding/NULL/traversal را غیرفعال کنید.
- بلوک SSRF-خروج برای باند خصوصی/ابرداده ؛ حفاظت از بازگشت DNS
- نرخ/سهمیه/همزمانی و ضد ربات (چالش ها) در فرم های عمومی.
- سایه/گزارش فقط → قناری → اجرای ؛ بازگشت خودکار توسط SLO و FP.
- معیارها/سیاهههای مربوط/مسیرهای پیاده روی با پوشش ؛ داشبورد «قوانین بالا «/FP.
- پچ مجازی و playbooks RCA ؛ آزمایشات بای پس منظم.
- پروفایل های جداگانه برای وب سایت های PSP/KYC، قلم های پرداخت و API های داخلی.
14) TL ؛ دکتر متخصص
Build protection by layers: normalization and limits → schemes/types → parameterization → WAF (CRS + caste) → فیلترهای نرخ/ربات → بلوک خروجی SSRF. تنظیم هر مسیر، اجرای قوانین جدید در سایه → canary، نظارت بر معیارها/FP و ایجاد «تکه های مجازی» قبل از اصلاح کد. برای مسیرهای پرداخت/webhook - پروفایل های سخت جداگانه، HMAC/mTLS و حداقل پنجره های اعتماد.