apache 从HTTP Basic Auth中排除特定URL- mod_rewrite导致问题

nsc4cvqm  于 2023-10-23  发布在  Apache
关注(0)|答案(2)|浏览(131)

我们在我们的某个子域上有“HTTP基本认证”,但希望允许所有内容访问该子域上的特定URL而无需进行身份验证(对于第三方访问我们的webhook URL)。
所以我尝试使用SetEnvIf Request_URI ^/webhook/ allow来允许Allow from env=allow(完整文件如下),但似乎因为我们有一些mod_rewrite规则来重写所有这些URL到PHP入口点,Request_URI实际上从来没有/webhook一旦到达这一点(猜测,但不知道如何100%确认这一点。
它仍然要求一个基本的auth用户/通行证,而不管URL是什么。

请注意,.htaccess文件在我们所有的域/子域上都是相同的,而VirtualHost可以只为这个子域配置。
完整的VirtualHost配置,包含“HTTP Basic Auth”配置部分:

  1. <VirtualHost *:80>
  2. RewriteEngine on
  3. RewriteCond %{HTTP:X-Forwarded-Proto} !https
  4. RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=permanent,L]
  5. DocumentRoot /var/www/sub.ourdomain.co.uk/blah/www
  6. ServerAdmin [email protected]
  7. ServerName sub.ourdomain.co.uk
  8. ServerAlias www.sub.ourdomain.co.uk
  9. ErrorDocument 400 /error.php
  10. ErrorDocument 401 /error.php
  11. ErrorDocument 403 /403.html
  12. ErrorDocument 404 /error.php
  13. ErrorDocument 405 /error.php
  14. ErrorDocument 408 /error.php
  15. ErrorDocument 410 /error.php
  16. ErrorDocument 411 /error.php
  17. ErrorDocument 412 /error.php
  18. ErrorDocument 413 /error.php
  19. ErrorDocument 414 /error.php
  20. ErrorDocument 415 /error.php
  21. ErrorDocument 500 /error.php
  22. ErrorDocument 501 /error.php
  23. ErrorDocument 502 /error.php
  24. ErrorDocument 503 /error.php
  25. ErrorDocument 506 /error.php
  26. ErrorLog /var/log/httpd/sub.ourdomain.co.uk.apache.log
  27. CustomLog /var/log/httpd/sub.ourdomain.co.uk.access.log combined
  28. <Directory "/var/www/sub.ourdomain.co.uk/blah/www">
  29. SetEnvIf Request_URI ^/webhook/ allow
  30. AuthType Basic
  31. AuthName "Restricted Content"
  32. AuthUserFile /etc/httpd/passwords/sub.ourdomain.co.uk
  33. # Setup a deny/allow
  34. Order Deny,Allow
  35. # Deny from everyone
  36. Deny from all
  37. # except if either of these are satisfied
  38. Satisfy any
  39. # 1. a valid authenticated user
  40. Require valid-user
  41. # or 2. the "allow" var is set
  42. Allow from env=allow
  43. </Directory>
  44. </VirtualHost>

.htaccess mod_rewrite规则:

  1. RewriteCond %{REQUEST_METHOD} !(^GET|^POST|^HEAD)
  2. RewriteRule .* - [R=405,L]
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts)
  6. RewriteRule ^(.*)$ /boot.php
  7. RewriteCond %{REQUEST_URI} ^/$
  8. RewriteRule ^(.*)$ /boot.php

编辑1-基于我也尝试过的评论:SetEnv allow trueSetEnv allow 1来消除对它是否是URL的怀疑,它仍然要求基本的授权密码,所以它可能与URL无关。
编辑2-添加整个.htaccess以确保我没有遗漏其他东西:

  1. php_value max_input_vars 4000
  2. RewriteEngine on
  3. # Disallow other HTTP verbs such as PUT and DELETE
  4. RewriteCond %{REQUEST_METHOD} !(^GET|^POST|^HEAD)
  5. RewriteRule .* - [R=405,L]
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7. RewriteCond %{REQUEST_FILENAME} !-f
  8. RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts|/twig|/pdf|/vendors|/server-status)
  9. RewriteRule ^(.*)$ /boot.php
  10. RewriteCond %{REQUEST_URI} ^/$
  11. RewriteRule ^(.*)$ /boot.php
  12. AddType font/ttf .ttf
  13. AddType font/eot .eot
  14. AddType font/otf .otf
  15. AddType font/woff .woff
  16. <IfModule mod_deflate.c>
  17. AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript application/javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/json font/woff font/otf font/eot font/ttf
  18. </IfModule>
  19. <ifModule mod_expires.c>
  20. ExpiresActive On
  21. ExpiresDefault "access plus 1 seconds"
  22. ExpiresByType text/html "access plus 1 seconds"
  23. ExpiresByType image/gif "access plus 2592000 seconds"
  24. ExpiresByType image/jpeg "access plus 2592000 seconds"
  25. ExpiresByType image/png "access plus 2592000 seconds"
  26. ExpiresByType text/css "access plus 604800 seconds"
  27. ExpiresByType font/ttf "access plus 604800 seconds"
  28. ExpiresByType font/eot "access plus 604800 seconds"
  29. ExpiresByType font/otf "access plus 604800 seconds"
  30. ExpiresByType font/woff "access plus 604800 seconds"
  31. ExpiresByType text/javascript "access plus 604800 seconds"
  32. ExpiresByType application/x-javascript "access plus 604800 seconds"
  33. </ifModule>
  34. <ifModule mod_headers.c>
  35. <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
  36. Header set Cache-Control "max-age=2592000, public, proxy-revalidate"
  37. </filesMatch>
  38. <filesMatch "\\.(js|css|ttf|eot|otf|woff)$">
  39. Header set Cache-Control "max-age=604800, public, proxy-revalidate"
  40. </filesMatch>
  41. <filesMatch "\\.(xml|txt)$">
  42. Header set Cache-Control "max-age=216000, public, must-revalidate"
  43. </filesMatch>
  44. </ifModule>

编辑3-对不起,应该提到我们现在被困在Apache 2.2上。

webghufk

webghufk1#

使用Apache 2.4+,您可以使用<If>表达式来禁用auth,或者使用THE_REQUEST变量为URI使用allow from all指令。THE_REQUEST表示发送给Apache的原始请求,它不会在单个请求的上下文中更新:

  1. AuthType Basic
  2. AuthName "Restricted Content"
  3. AuthUserFile /etc/httpd/passwords/sub.ourdomain.co.uk
  4. Require valid-user
  5. Satisfy any
  6. Order deny,allow
  7. Deny from all
  8. <If "%{THE_REQUEST} =~ /webhook/">
  9. Satisfy any
  10. Allow from all
  11. </If>
  12. # your current mod_rewrite rules can appear below this line:
  13. DirectoryIndex boot.php
  14. RewriteEngine on
  15. # Disallow other HTTP verbs such as PUT and DELETE
  16. RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)
  17. RewriteRule ^ - [R=405,L]
  18. RewriteCond %{REQUEST_FILENAME} !-d
  19. RewriteCond %{REQUEST_FILENAME} !-f
  20. RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts|/twig|/pdf|/vendors|/server-status)
  21. RewriteRule ^ boot.php [L]

更新:这里有一个解决方案,适用于使用<FilesMatch>指令的Apache 2.2

  1. DirectoryIndex boot.php
  2. RewriteEngine on
  3. # Disallow other HTTP verbs such as PUT and DELETE
  4. RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)
  5. RewriteRule ^ - [R=405,L]
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7. RewriteCond %{REQUEST_FILENAME} !-f
  8. RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts|/twig|/pdf|/vendors|/server-status)
  9. RewriteRule ^ boot.php [L]
  10. SetEnvIfNoCase Request_URI ^/webhook/ allow
  11. <FilesMatch "^(?!boot\.php$).*$">
  12. AuthType Basic
  13. AuthName "Restricted Content"
  14. AuthUserFile /etc/httpd/passwords/sub.ourdomain.co.uk
  15. Require valid-user
  16. Order Deny,Allow
  17. Deny from all
  18. Allow from env=allow
  19. Satisfy any
  20. </FilesMatch>
展开查看全部
fcipmucu

fcipmucu2#

注意@anubhava的回复-它包含一个安全问题!
<If "%{THE_REQUEST} =~ /webhook/">只检查请求是否 * 包含 * 字符串“/webhook/"。因此,通过将?uselessParameter=/webhook/添加到您的请求中,您可以访问所有应受密码保护的私有资源!
您可以使用^字符匹配THE_REQUEST变量的开头。但这意味着你的正则表达式还必须包含HTTP动词。

  1. <If "%{THE_REQUEST} =~ ^GET /webhook/">

遗憾的是,似乎没有Apache参数包含实际的URI或实际的路径--至少我找不到。

相关问题