There’s a function that sets up the default variables to pass to CGI programs, called
ap_add_common_vars
. This function expects that other users on the server can see these variables with ps -e
, so to hide usernames and passwords from appearing in there, it specifically avoids passing Authorization
through to CGI.FastCGI uses the same
ap_add_common_vars
function, and mod_proxy_fcgi
doesn’t take any special care to put the Authorization back in for requests that are sent over a socket. Thus, by default, no FastCGI requests will receive usernames and passwords.The standard workaround is to use
mod_rewrite
to set an environment flag if the request has authorization. Because nothing unsets the Authorization—ap_add_common_vars
simply skips setting a default—that explicitly-set environment variable will be included in the FastCGI request.RewriteCond %{HTTP:Authorization} .
RewriteRule / - [E:HTTP_AUTHORIZATION=%{HTTP:Authorization}]
That’s fine if you’re already using
mod_rewrite
. Can it be done without that module? I haven’t benchmarked the difference, but mod_setenvif can do it via the rule:SetEnvIf Authorization (.+) HTTP_AUTHORIZATION=$1
tl;dr: Authorization isn’t passed to FastCGI because of the default protection from exposing passwords with slow CGI. It can safely be passed to a FastCGI server (requests are sent over a socket, not through world-readable process attributes) but it must be explicitly passed.
Updated 28 Jul 2015: I finally tested the SetEnvIf rule. I also mentioned what Apache line I'm working with.
No comments:
Post a Comment