使用Download_url时绕过.htaccess

时间:2016-04-11 作者:SinisterBeard

我有以下内容。我的一个自定义目录中的htaccess文件被称为client。

RewriteEngine On
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area*
RewriteRule ^.*$ - [R=403,L]
ErrorDocument 403 \'http://www.example.co.uk/client-area/\'
因此,如果有人试图从客户端区域页面以外的任何地方访问uploads/client/directory中的文件,他们就会被重定向。

但是,当我使用download_url 访问该目录中的文件。我是否可以使用重写条件来促进这一点?

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

您可以通过过滤将虚构的引用注入WordPress的HTTP请求pre_http_request. 您只需要这样一个简单的类(未测试!):

class FakeWpReferer
{
    private $referer;

    private $url;

    private $is_regex;

    /**
     * @param string $referer
     * @param string $url URL to fake the referer for.
     * @param bool   $is_regex Is $url a regular expression?
     */
    public function __construct( $referer, $url, $is_regex = FALSE )
    {
        $this->referer  = $referer;
        $this->url      = $url;
        $this->is_regex = $is_regex;
    }

    /**
     * @wp-hook pre_http_request
     * @param   array $args
     *
     * @return array
     */
    public function inject( array $args, $url )
    {
        if ( $this->match_url( $url ) )
            $args[\'headers\'][\'Referer\'] = $this->referer;

        return $args;
    }

    /**
     * @param string $request_url
     *
     * @return bool
     */
    private function match_url( $request_url )
    {
        if ( ! $this->is_regex )
            return $request_url === $this->url;

        return (bool) preg_match( $this->url, $request_url );
    }
}
然后将其注册为筛选器:

$fake = new FakeWpReferer(
    \'http://example.co.uk/client-area\',
    \'~^http://www.example.co.uk/uploads/~\',
    TRUE
);
add_filter( \'pre_http_request\', [ $fake, \'inject\' ], 10, 2 );
然后您可以使用download_url(), WordPress将使用您的自定义referer。要知道,其他人也可以伪造推荐人,所以你的“保护”不是真正的保护。