مشاوره برای انتخاب روش مناسب برای اعمال Content Security Policy

nginx
elixir
phoenix
csp

#1

سلام
من csp رو به دو روش میتونم پیاده بکنم:

  1. اول قرار دادن csp داخل کد برنامه الکسیر و فونیکس
  2. دوم قرار دادن csp داخل تنظیمات nginx و اعمال خودکار برروی تگ های script و style که خودش باز دو نوع داره:

==========================================================================

1. با استفاده از plug که @samdvr عزیز معرفی کردن و من برای پیاده کردن nonce یک تابع رندوم ایجاد کردم و در پلاگ قرار دادم

==========================================================================

2. تنظیمات ‌nginx

روش A


set_secure_random_alphanum $cspNonce 32;  
add_header Content-Security-Policy "base-uri 'self'; default-src 'self' 'unsafe-inline' https://www.google-analytics.com ; script-src 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com/ https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ 'strict-dynamic' 'nonce-$cspNonce' ; style-src 'unsafe-inline' https://www.googletagmanager.com  https://fonts.googleapis.com/ https://www.google.com/recaptcha/ 'strict-dynamic' 'nonce-$cspNonce' ; img-src 'unsafe-inline' https://ssl.gstatic.com/  example.com/images/ https://stats.g.doubleclick.net https://www.google-analytics.com/ ; frame-src example.com/phoenix/live_reload/frame https://www.gstatic.com/ https://www.google.com/ https://www.googletagmanager.com/ns.html ; font-src 'self' https://example.com/fonts/  https://fonts.gstatic.com ; connect-src www.google-analytics.com https://www.google-analytics.com https://stats.g.doubleclick.net ; object-src 'none';" always;  
sub_filter_once off;  
sub_filter_types *;  
sub_filter CSP_NONCE $cspNonce; 

استفاده در کد به این صورت که خوده nginx مقدار رشته تصادفی رو با CSP_NONCE عوض میکنه

<script nonce="CSP_NONCE">...</script>  

=================================================

روش B


location / {
    [...]

    set_by_lua_block $cspNonce  {
        local basexx = require('basexx')
        local file = assert(io.open('/dev/urandom', 'rb'))
        local bytes = file:read(32)
        file:close()
        return basexx.to_base64(bytes)
    }

    [...]
}

بعد


    add_header Content-Security-Policy "base-uri 'self'; default-src 'self' 'unsafe-inline' https://www.google-analytics.com ; script-src 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com/ https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ 'strict-dynamic' 'nonce-$cspNonce' ; style-src 'unsafe-inline' https://www.googletagmanager.com  https://fonts.googleapis.com/ https://www.google.com/recaptcha/ 'strict-dynamic' 'nonce-$cspNonce' ; img-src 'unsafe-inline' https://ssl.gstatic.com/  example.com/images/ https://stats.g.doubleclick.net https://www.google-analytics.com/ ; frame-src example.com/phoenix/live_reload/frame https://www.gstatic.com/ https://www.google.com/ https://www.googletagmanager.com/ns.html ; font-src 'self' https://example.com/fonts/  https://fonts.gstatic.com ; connect-src www.google-analytics.com https://www.google-analytics.com https://stats.g.doubleclick.net ; object-src 'none';" always;
    sub_filter_once off;
    sub_filter_types text/html;
    sub_filter_last_modified on;
    sub_filter '<script' '<script nonce="$cspNonce"';
    sub_filter '<style' '<style nonce="$cspNonce"';

==========================================================================

چند تا سوال داشتم

آیا قوانین csp باید روی وب سرور(nginx) انجام بشه ؟
یا باید روی برنامه وب(الکسیر) انجام بشه ؟
یا روی هردو؟

اگر روی وب سرور انجام بشه performance بالاتر هست یا روی برنامه وب ؟
استفاده از کدوم روش بالا در تنظیمات nginx بهتر هست A | B ؟


#2

اعمال CSP فقط در یک لایه کافیه , احتمالا در ngnix بهتره و performance بهتری داره
به نظر روش A ساده تره
ولی من آنقدر نمیدونم که راجعبه این روش ها نظری داشته باشم


#3

پس نیاز نیست که دوباره در الکسیر برای nonce پلاگ تعریف بکنم . روی این مورد شک داشتم . ممنون از شما :pray:

حالا بین روش اول و دوم در Nginx باید ببینم کدوم از نظر کارایی و امنیت بهتره :thinking: . البته ماژول Lua ظاهرا بیشتر از set-misc-nginx-module استفاده شده