flask CSP (Content-Security-Policy) передовой метод защиты от атак, таких как межсайтовый скриптинг - PullRequest
1 голос
/ 06 августа 2020

Я новичок в CSP. Я пытаюсь реализовать CSP во всех моих шаблонах в моем приложении flask, установив resp_header для защиты моего сайта от атаки межсайтового скриптинга. Я изменил свой шаблон рендеринга с:

return render_template('addvideos.html`  form=form, legend = 'Update video : '+ videos.video_name)

на

    resp = make_response(render_template('addvideos.html', legend = 'Update video : '+ videos.video_name)
)
    resp.headers['Content-Security-Policy'] = "default-src 'self';"
    return resp

У меня более 50 «render_template» в приложении, и мне нужно будет добавить заголовок ответа для каждого. После исследования я выяснил, что after_request поможет, как показано ниже:

@app.after_request
def add_security_headers(resp):
    resp.headers['Content-Security-Policy']='default-src \'self\''
    return resp

это очень надежно? Что, если я применю CSP непосредственно в шаблоне HTML (jinja2), возможно ли это? Что надежнее? Любое хорошее предложение будет приветствоваться. Спасибо

1 Ответ

1 голос
/ 06 августа 2020

это очень надежно?

Да. Установка этого заголовка в декораторе app.after_request применяет заголовок ко всем маршрутам, обслуживаемым этим app.

Что, если я применяю CSP непосредственно в шаблоне HTML (jinja2), это то, что возможно?

Не то, что можно сделать в самом шаблоне, вы бы установили этот заголовок внутри Python, как указано выше.

Что более надежно?

Хотя первый метод (через декоратор app.after_request) работает, обычно это то, что может обрабатываться обратным прокси-сервером, за которым находится ваш Python сервер приложений. Если это вам незнакомо, посмотрите документацию по развертыванию .

Например, используя nginx в качестве обратного прокси-сервера, вы можете поместить это в свой блок server:

add_header Content-Security-Policy "default-src 'self';";

Или, чтобы отправить заголовок независимо от кода ответа:

add_header Content-Security-Policy "default-src 'self';" always;

В этом блоге есть несколько хороших советов о том, разрешить ли обратному прокси-серверу обрабатывать отправку этого заголовка или определить это в вашем приложении Flask:

Должен ли я добавлять заголовок CSP с помощью nginx или мое в приложении? Хотя, конечно, легко добавить заголовок CSP с помощью nginx, также можно добавить заголовок Content-Security-Policy с языком программирования на стороне сервера ([Flask]). В любом случае есть компромиссы. Если у вас есть разделы вашего приложения, для которых может потребоваться другая политика CSP, тогда, возможно, будет проще использовать ваш язык программирования приложений. Или, если вы планируете использовать такие функции, как CSP nonce , тогда гораздо проще установить Content-Security-Policy из кода вашего приложения, а не из nginx.

Кроме того, если вы развертываете платформу, такую ​​как Heroku, которая в базовой конфигурации c напрямую предоставляет сервер приложений Gunicorn, тогда, вероятно, будет проще установить этот заголовок в своем приложении, если вы не планируете go дальше и развернуть nginx buildpack.

Другие облачные балансировщики нагрузки могут предоставлять свой собственный способ установки этих заголовков, независимо от вашего приложения.

? При настройке обратного прокси-сервера или балансировщика нагрузки на него стоит обратить внимание at Генератор конфигурации SSL Mozilla , который поддерживает nginx, AWS ALB / ELB и другие. Затем сервер можно протестировать с помощью Qualys SSL test .

...