使用与符号问题保护上载文件夹文件

时间:2021-01-29 作者:crmau

想知道是否有人可以帮助解决这个问题。我已经能够使用以下方法在WordPress中实现文件保护:

<小时/>。htaccess

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ checkloggedin.php?file=$1 [QSA,L]
检查日志数据。php有代码确保用户在提供文件之前已登录,否则将显示登录页面。

这完全符合我的要求,但如果文件包含与(&;)号文件不会加载或显示。我得到的错误如下:

PHP警告:mime\\u content\\u type()无法打开流:没有这样的文件或目录

我找到了其他几个提到改变的例子RewriteRule [QSA,L]RewriteRule [BNC] (参见http://httpd.apache.org/docs/current/rewrite/flags.html#flag_b).

我尝试了许多不同的B标志组合,但这会导致更大的问题,因为文件将加载,但checkloggedin中没有任何代码。检查用户是否登录的php工作正常。

如果文件中包含一个符号AND,是否有人知道此问题的解决方案?

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

正如你所说的B 在这种情况下需要标记。但这应该是[B,L], 不[BNC] 正如你多次引用的那样?

不知道你从哪里得到的[BNC] 来自,但这是完全无效的,并且会破坏Apache服务器(500内部服务器错误响应)。如果使用此无效标志未看到错误,那么您可能位于LiteSpeed服务器上,该服务器会悄悄忽略错误,并且指令不会运行,从而允许对文件进行无限制的访问(这似乎就是您在此处看到的)。

这个B 需要标记才能对& (作为%26) 在将其传递给查询字符串之前,从请求的解码URL捕获,以便传递整个;“文件名”;而不仅仅是&.

例如,如果您请求/wp-content/uploads/abc%26def.pdf 并且不要使用B 标志,则生成的请求将是:

checkloggedin.php?file=abc&def
这实际上是两个URL参数:file=abcdef=

使用B 标志,捕获的反向引用将重新编码,并变为:

checkloggedin.php?file=abc%26def
PHP/WordPress然后将其解码为abc&def - 完整的文件名。

因此,完整的规则应该是:

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*) checkloggedin.php?file=$1 [B,L]
TheQSA 标志不是必需的,除非您在初始文件请求中传递其他查询字符串参数?尾部$RewriteRule 模式也不是必需的,因为默认情况下regex是贪婪的。

如果这仍然不起作用,则问题在于checkloggedin.php 剧本但从您所说的来看,在使用BNC - 这就是为什么我认为您使用的是LiteSpeed服务器(不是Apache)。

<小时/>

UPDATE:

另一种方法是将文件名作为路径信息传递,而不是作为查询字符串中的URL参数传递。这样,您就不容易出现与& (这不是URL路径中的特殊字符)。

因此,在.htaccess:

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*) checkloggedin.php/$1 [L]
TheB 不需要标记。

匹配的URL路径RewriteRule 模式已经%解码(因此原始请求是否包含&%26). “相同”;“文件”;值作为路径信息(其他路径名信息)传递,因此可通过$_SERVER[\'PATH_INFO\'] 超全局,而不是$_GET[\'file\'].

因此,在脚本中,您需要执行以下操作来填充$filename 变量:

$filename = isset($_SERVER[\'PATH_INFO\']) ? $_SERVER[\'PATH_INFO\'] : null;

相关推荐

使用htaccess将WordPress中的旧帖子URL重定向到404

在WordPress中,我有一篇带有URL的帖子https://www.example.com/article.html.我将其永久链接重命名为https://www.example.com/article-new.html.现在如果我打开旧的URLhttps://www.example.com/article.html 然后它自动301重定向到https://www.example.com/article-new.html 由于默认情况下WordPress内置功能。但是,我想在有人试图打开时显示404h