.htaccess受保护的目录和curl

ijnw1ujt  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(128)

我想禁止访问服务器上受保护目录中所有文件和文件夹。
我已经在该目录下的.htaccess文件中使用了此命令:

Deny from all

但问题是我还想使用另一个网站的curl来查询这个目录中的一个文件:

$curl = curl_init();
$post_data = array();
$post_data['token'] = $token;
curl_setopt($curl, CURLOPT_POST, true);
$url = 'https://my-website.com/protected-dir/file.php';
curl_setopt($curl, CURLOPT_URL, $url );
$response = curl_exec($curl);
if (curl_errno($curl)) { 
     return(curl_errno($curl)); 
} else{
    return $response;
}

curl_close($curl);

现在我从CURL得到了错误22。我想保护对该目录下所有文件和文件夹的直接访问。我有什么选择?
1.我可以把这个目录放在Web根目录之外,但是我该如何使用CURL呢?(该文件的URL是什么?)
1.其他解决方案?

5jdjgkvh

5jdjgkvh1#

简单的答案是将文件保留在文档根目录中,然后只需向.htaccess文件添加一个allow异常,该异常列出了您希望允许其命中的远程服务器的IP地址:

allow from 1.2.3.4
deny from all

但要注意的是,这将允许该机器上的任何用户获取文件。安全的答案是始终将敏感内容放在文档根目录之外,永远不要依赖.htaccess来保护你。然后创建一个经过验证的代理页面来处理任何例外情况。

public/
    index.php
    secret.php
private/
    secret_file

其中public是文档根,index.php是常规站点,secret.php类似于:

// run some checks to ensure that you're allowed to do this:
//   maybe check source IP
//   maybe check for a username and password
//   maybe check for a specific bearer token in a header
header('Content-Type: whatever');
readfile('/path/to/private/secret_file');
uidvcgyl

uidvcgyl2#

看起来(从评论中)这段代码是WordPress插件的一部分,可以潜在地安装在任何网站上。在这种情况下,这个文件需要是"公共"的。
该文件本来就不应该在protected目录中,但是,你可以使用<FilesMatch>容器和regex/negative lookahead来阻止除该文件之外的所有文件。
例如:

<FilesMatch "^(?!file\.php$).*">
    Require all denied
</FilesMatch>

除了对file.php的请求之外,所有的请求都被阻止。注意,Deny指令以前已被弃用,您应该在Apache 2.4+上使用相应的Require指令。(但请注意,您不应该混用新旧验证指令。
我假设您的脚本包含通常的验证,例如:

  • 在任何非POST请求早期失败。
  • 在任何不包含适当token参数的POST请求上失败。
  • 对任何失败的 * token * 请求强制"延迟",以防止暴力攻击。

您还可以将自定义User-Agent字符串设置为CURL(POST)请求的一部分,并在脚本中或.htaccess的早期版本中检查这一点-但这只是烟雾和镜子,并没有真正提供任何额外的"保护"。

相关问题