یک نکتهی تکمیلی: ارتقاء به نگارش 3.1 و تغییر تنظیمات کوکیها
مرورگر کروم، از نگارش 80 آن به بعد به همراه یک تغییر غیرسازگار با نگارشهای قبلی آن است: از این پس تمام کوکیهای آن در صورتیکه تنظیمات SameSite را نداشته باشند، به صورت SameSite=Lax تفسیر میشوند؛ که تغییر امنیتی فوق العادهای است و سبب خواهد شد تا بسیاری از حملات مانند CSRF به طور کامل غیرعملی شوند. اما ... این مورد سبب از کار افتادن برنامههایی خواهد شد که از سرویسهایی مانند IdentityServer استفاده میکنند. در یک چنین حالتی نیاز خواهید داشت برای رفع این مشکل، SameSite=None را تنظیم کنید.
اما SameSite چیست؟ تنظیم و خاصیت SameSite از سال 2016 به کوکیها اضافه شد تا بتوان توسط آن در برابر حملات CSRF مقاومت کرد؛ مقادیر اولیهی آن نیز Lax و Strict بودند. Lax به این معنا است که کوکیها در حین مرور یک سایت، باید به صورت خودکار به سمت سرور همان سایت ارسال شوند؛ اما در حالت مرور سایت و هدایت از طریق سایتهای دیگر به سایت ما، فقط درخواستهای GET رسیده میتوانند کوکیها را نیز ارسال کنند. حالت Strict آن فقط کوکیهای تنظیم شدهی درون یک سایت را معتبر شمرده و ارسال میکند. عدم تنظیم SameSite نیز مشکل خاصی را ایجاد نمیکرد. برای مثال اعمال اعتبارسنجی مبتنی بر OpenIdConnect مانند login/logout، نیاز دارند در طی یک درخواست POST، اطلاعاتی را به سایت خارجی درخواست کننده ارسال کنند. برای اینکه این عملیات به درستی صورت گیرد، میبایستی تنظیمات SameSite انجام نمیشد تا جابجایی کوکیها بین دو دومین مختلف در حالت POST، بدون مشکل صورت میگرفت.
مشکل مهم! مقدار None را فقط مرورگر کروم متوجه میشود و جزو استاندارد SameSite نیست! در این استاندارد اگر مقدار SameSite تنظیم شود و مرورگر نتواند آنرا تشخیص دهد (مانند iOS 12)، مقدار Strict را به عنوان مقدار دریافتی تنظیم میکند! به همین جهت برنامهی شما باید بر اساس نوع مرورگر تصمیمگیری کند که آیا باید SameSite را به خروجی اضافه کند یا خیر.
وضعیت دات نت در این مورد: با به روز رسانیهای جدید دات نت 4.7.2 و همچنین NET Core 2.1.، مقدار جدید None توسط برنامه (در CookieOptions) قابل تنظیم خواهد بود که سبب تولید SameSite=None میشود. به علاوه در NET Core 3.1.، مقدار SameSite.Unspecified را نیز میتوان تنظیم کرد که سبب خواهد شد تا خاصیت SameSite اصلا تنظیم نشود (اصلا به درخواست اضافه نشود؛ تا مرورگرهایی که نمیتوانند مقدار None را تفسیر کنند، به اشتباه آنرا به Strict تنظیم نکنند).
به صورت خلاصه: اگر برنامهی شما از OpenIdConnect و یا IdentityServer استفاده نمیکند، هیچ تنظیمی را تغییر ندهید! تنظیم پیشفرض SameSite=Lax گوگل سبب میشود تا عملا حملات CSRF دیگر بر روی سایت شما قابل اجرا نباشد. اما اگر از IdentityServer استفاده میکنید، این تنظیم پیشفرض، سبب از کار افتادن امکان ارسال کوکیهای حالت POST، به سایتهای خارجی میشود و برنامه و سیستم شما از کار خواهد افتاد.
مرورگر کروم، از نگارش 80 آن به بعد به همراه یک تغییر غیرسازگار با نگارشهای قبلی آن است: از این پس تمام کوکیهای آن در صورتیکه تنظیمات SameSite را نداشته باشند، به صورت SameSite=Lax تفسیر میشوند؛ که تغییر امنیتی فوق العادهای است و سبب خواهد شد تا بسیاری از حملات مانند CSRF به طور کامل غیرعملی شوند. اما ... این مورد سبب از کار افتادن برنامههایی خواهد شد که از سرویسهایی مانند IdentityServer استفاده میکنند. در یک چنین حالتی نیاز خواهید داشت برای رفع این مشکل، SameSite=None را تنظیم کنید.
اما SameSite چیست؟ تنظیم و خاصیت SameSite از سال 2016 به کوکیها اضافه شد تا بتوان توسط آن در برابر حملات CSRF مقاومت کرد؛ مقادیر اولیهی آن نیز Lax و Strict بودند. Lax به این معنا است که کوکیها در حین مرور یک سایت، باید به صورت خودکار به سمت سرور همان سایت ارسال شوند؛ اما در حالت مرور سایت و هدایت از طریق سایتهای دیگر به سایت ما، فقط درخواستهای GET رسیده میتوانند کوکیها را نیز ارسال کنند. حالت Strict آن فقط کوکیهای تنظیم شدهی درون یک سایت را معتبر شمرده و ارسال میکند. عدم تنظیم SameSite نیز مشکل خاصی را ایجاد نمیکرد. برای مثال اعمال اعتبارسنجی مبتنی بر OpenIdConnect مانند login/logout، نیاز دارند در طی یک درخواست POST، اطلاعاتی را به سایت خارجی درخواست کننده ارسال کنند. برای اینکه این عملیات به درستی صورت گیرد، میبایستی تنظیمات SameSite انجام نمیشد تا جابجایی کوکیها بین دو دومین مختلف در حالت POST، بدون مشکل صورت میگرفت.
با تغییر جدید گوگل، حالت پیشفرض SameSite که اجباری نبود، به صورت اجباری به Lax تنظیم شدهاست؛ اما برای حالاتی مانند OpenIdConnect، مقدار None را نیز اضافه کردهاست. به همین جهت این نوع برنامهها اگر از تنظیم SameSite=None استفاده نکنند، دیگر نمیتوانند کوکیهای درخواستهای POST را بین دومینهای مختلف جابجا کنند.
وضعیت دات نت در این مورد: با به روز رسانیهای جدید دات نت 4.7.2 و همچنین NET Core 2.1.، مقدار جدید None توسط برنامه (در CookieOptions) قابل تنظیم خواهد بود که سبب تولید SameSite=None میشود. به علاوه در NET Core 3.1.، مقدار SameSite.Unspecified را نیز میتوان تنظیم کرد که سبب خواهد شد تا خاصیت SameSite اصلا تنظیم نشود (اصلا به درخواست اضافه نشود؛ تا مرورگرهایی که نمیتوانند مقدار None را تفسیر کنند، به اشتباه آنرا به Strict تنظیم نکنند).
به صورت خلاصه: اگر برنامهی شما از OpenIdConnect و یا IdentityServer استفاده نمیکند، هیچ تنظیمی را تغییر ندهید! تنظیم پیشفرض SameSite=Lax گوگل سبب میشود تا عملا حملات CSRF دیگر بر روی سایت شما قابل اجرا نباشد. اما اگر از IdentityServer استفاده میکنید، این تنظیم پیشفرض، سبب از کار افتادن امکان ارسال کوکیهای حالت POST، به سایتهای خارجی میشود و برنامه و سیستم شما از کار خواهد افتاد.