【问题标题】:Filtering QUERY_STRING with back references in RewriteCond在 RewriteCond 中使用反向引用过滤 QUERY_STRING
【发布时间】:2015-06-17 13:30:44
【问题描述】:

我有一个 PHP 脚本,用于在将图像显示在网页上之前对其进行处理。必须检查查询字符串以拒绝来自外部域的所有请求。 如果 TLD 是 example.com

http://example.com/process.php?img=somepath/images/imgX.png OK
http://example.com/process.php?img=http://example.com/anotherpath/folder/images/imgX.png OK
http://example.com/process.php?img=http://anotherdomain.com/images/someimg.jpg Rejected!

此重写规则适用于我的测试服务器:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http://
RewriteCond expr "! %{QUERY_STRING} -strmatch '*%{HTTP_HOST}*'"
RewriteRule .* - [F]
</IfModule>

但是在生产服务器上这不起作用。经过一番头疼和搜索后,我发现在 Apache 2.4 之前不支持 expr ...
根据我阅读的内容,我可以使用原子反向引用来检查 %{QUERY_STRING} 中是否存在 %{HTTP_HOST}。这个想法是构建这样的东西

RewriteCond %{HTTP_HOST}::%{QUERY_STRING} ^(.*?)::/\1/?

这显然在当前状态下不起作用。对此语法的任何帮助和进一步解释将不胜感激。

【问题讨论】:

  • RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// 如何允许?img=somepath/images/imgX.png 查询字符串?
  • 这就是重点,它不允许这样做。由于不满足条件,所以忽略其余部分,不应用RewriteRule Forbidden,正常处理请求。

标签: php regex apache .htaccess backreference


【解决方案1】:

您可以在 Apache 2.2 中使用此规则:

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http://
RewriteCond %{HTTP_HOST}#%{QUERY_STRING} !^([^#]+)#.*?\1
RewriteRule ^ - [F]

\1HTTP_HOST 的反向引用

将 RewriteCond 修改为

RewriteCond %{HTTP_HOST}#.*#%{QUERY_STRING} !^([^#]+)#.*?\1

这会捕获任何 URL 结构。杰夫

【讨论】:

  • 感谢 anubhava 我刚刚尝试了您的解决方案,但它不起作用。 (不执行过滤)。
  • 我已经对所有 3 个案例进行了全面测试,并且在我的 Apache 上按预期工作。
  • 今天一定不走运 ;) 在 2 台服务器(Apache 2.2 和 2.4)上进行了测试,到目前为止还没有工作。该规则不会拒绝包含外部域的查询字符串。我的 .htaccess 文件中没有其他规则
  • 我还在 2 个 Apache 版本 2.2 和 2.4 上对此进行了测试,并且两者都适用。您是否使用所显示的完全相同的 URL 进行测试?什么不工作?你根本没有得到 403 吗?
  • 不,问题中显示的 URL 只是示例,结构可以不同。对不起,我应该更具体。我对您的 RewriteCond 做了一些小调整,现在它可以与任何 URL 一起使用。在 2 个变量之间添加 .* 就可以了。 RewriteCond %{HTTP_HOST}#.*#%{QUERY_STRING} !^([^#]+)#.*?\1 感谢您的帮助,非常感谢:)
【解决方案2】:

如果您想在 PHP 领域执行此操作,则可以使用 parse_url

Link to PHP documentation.

【讨论】:

  • 我显然已经在 php 文件中实现了这一点,但希望在服务器级别有一个额外的安全层。
猜你喜欢
  • 2011-02-11
  • 2023-03-15
  • 2013-04-04
  • 2020-08-05
  • 2010-12-04
  • 1970-01-01
  • 2013-07-29
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多