1

我正在为我的一个站点构建一种内容安全策略生成器。我被它的 .htaccess 部分的一个特定部分难住了

生成的 .htaccess 是:

# Media Sources
SetEnv CSP_Media "media-src 'self' ;"

# Default Sources
SetEnv CSP_Default "default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
SetEnv CSP "%{ENV:CSP_Default} %{ENV:CSP_Media}"
Header always set Content-Security-Policy %{ENV:CSP}
Header always set X-Content-Security-Policy %{ENV:CSP}

当我离开引号时SetEnv CSP,我得到一个不同的错误:SetEnv takes 1-2 arguments这是有道理的......但是在引号周围,我得到了Unrecognized header format %错误

我可以做些什么来利用变量来解决这个问题,或者如何解决这个header format问题?

4

1 回答 1

2

这里有几个问题...

SetEnv CSP "%{ENV:CSP_Default} %{ENV:CSP_Media}"

这实际上将CSP环境变量设置为文字值%{ENV:CSP_Default} %{ENV:CSP_Media}-CSP_DefaultCSP_Mediaenv 变量没有展开。AFAIK 无法在SetEnv指令的 value 参数中引用环境变量。

您可以改用 mod_rewrite (或SetEnvIfExpr- 见下文)来创建这个CSPenv var,它是两个现有 env var 的串联,由空格分隔。

但是,SetEnv(mod_env) 在 mod_rewrite 请求中处理得太晚(处理得非常早),无法读取这些环境变量。因此,您将需要使用SetEnvIf(mod_setenvif) 代替(或者也使用 mod_rewrite 来设置初始环境变量)。

例如:

RewriteEngine On

# Media Sources
SetEnvIf ^ ^ "CSP_Media=media-src 'self' ;"

# Default Sources
SetEnvIf ^ ^ "CSP_Default=default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
RewriteRule ^ - "[E=CSP:%{ENV:CSP_Media} %{ENV:CSP_Default}]"

请注意策略性放置的双引号,因为value参数包含空格

  • SetEnvIf- 指令中的整个name=valueSetEnvIf必须用双引号引起来(不是value)。

  • RewriteRule- 整个flags参数需要用双引号括起来(不是value)。

更新:您可以避免在上面使用 mod_rewrite 并使用SetEnvIfExpr指令来使用Apache 表达式(Apache 2.4)连接环境变量。

例如:

# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=$1

表达式 LHS 上的点 ( .) 是字符串连接运算符(很像 PHP)。它们不会作为正则表达式 (RHS) 捕获的字符串的一部分出现并用作反向引用中的连接$1

访问Header指令中的 env var

Header always set Content-Security-Policy %{ENV:CSP}
Header always set X-Content-Security-Policy %{ENV:CSP}

mod_headers 使用不同的语法来访问 env vars 的值,因此出现“无法识别的标头格式 %”错误。你需要%{var}e改用。

例如:

Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e

或者,您可以通过不创建中间环境变量来避免 mod_rewrite 和 mod_setenvifCSP并将它们组合在Header指令中。

例如:

# Media Sources
SetEnv CSP_Media "media-src 'self' ;"

# Default Sources
SetEnv CSP_Default "default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
Header always set Content-Security-Policy "%{CSP_Media}e %{CSP_Default}e"
Header always set X-Content-Security-Policy "%{CSP_Media}e %{CSP_Default}e"

由于空格value参数需要用双引号引起来。


我正在为我的一个站点构建一种内容安全策略生成器。

虽然,如果此代码是“自动生成的”(?),那么为什么不Header一步生成完整的代码呢?

于 2020-12-17T02:42:28.017 回答