Добавить значение к переменной окружения в SetEnvIfExpr Apache - PullRequest
0 голосов
/ 27 августа 2018

У меня есть это в моем .htaccess

SetEnvIfExpr "env('USE_CSP') == 1"\
    "CSP_SCRIPT_SRC='self'"
Header always set Content-Security-Policy \
    "default-src 'self' ;\
    script-scr %{CSP_SCRIPT_SRC}e ;"

Теперь я хотел бы также иметь data: в списке разрешенных протоколов CSP, когда установлена ​​переменная окружения POLYMER_CSP, поэтому у меня есть:

SetEnvIfExpr "env('USE_CSP') == 1"\
    "CSP_SCRIPT_SRC='self'"
SetEnvIfExpr "env('POLYMER_CSP') == 1"\
    "CSP_SCRIPT_SRC='self' data:"
Header always set Content-Security-Policy \
    "default-src 'self' ;\
    script-scr %{CSP_SCRIPT_SRC}e ;"

Но это означает, что когда я изменяю 1-е определение CSP_SCRIPT_SRC, тогда мне приходится менять 2-е:

SetEnvIfExpr "env('USE_CSP') == 1"\
    "CSP_SCRIPT_SRC='self' https://*.my.web"
SetEnvIfExpr "env('POLYMER_CSP') == 1"\
    "CSP_SCRIPT_SRC='self' data:" # Here, the https://*.my.web has been forgotten
Header always set Content-Security-Policy \
    "default-src 'self' ;\
    script-scr %{CSP_SCRIPT_SRC}e ;"

Так что это трудно поддерживать. Поэтому я хотел бы добавить data: к существующему значению CSP_SCRIPT_SRC, но использование %{CSP_SCRIPT_SRC} или %{ENV:CSP_SCRIPT_SRC} не работает.

Документация Apache для SetEnvIf говорит

третий ("ENV=value") установит для переменной буквальное значение, заданное значением. [...] Apache httpd распознает вхождения $ 1 .. $ 9 в пределах значения и заменяет их подвыражениями в скобках регулярного выражения

Так что я нашел только один способ:

SetEnvIfExpr "env('USE_CSP') == 1"\
    "CSP_SCRIPT_SRC='self' https://*.my.web"
SetEnvIfExpr "env('POLYMER_CSP') == 1 && env('CSP_SCRIPT_SRC') =~ /(^.*$)/"\
    "CSP_SCRIPT_SRC=$0 data:" 
Header always set Content-Security-Policy \
    "default-src 'self' ;\
    script-scr %{CSP_SCRIPT_SRC}e ;"

Но есть ли "более симпатичный" способ добиться такой конкатенации значений в SetEnvIfExpr?

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