gpt4 book ai didi

apache - 在 htaccess 重写规则中附加一个 secret token 作为查询字符串有多安全?

转载 作者:行者123 更新时间:2023-12-02 01:10:37 24 4
gpt4 key购买 nike

我在尝试提供 mod-rewrite redirect but prevent direct access 的答案时进行了一些测试.

Original question goal is basically mask example.com/public/foo as example.com/foo while forbidding access to the real URL example.com/public/foo.

在我找到一个可能的解决方案后,将 token 附加到重写的 URL 的查询字符串中,

RewriteCond %{REQUEST_URI} !/public/
RewriteRule ^(.*)$ /public/$1?token=SECRET_TOKEN [L]

RewriteCond %{REQUEST_URI} /public/
RewriteCond %{QUERY_STRING} !token=SECRET_TOKEN
RewriteRule ^(.*)$ / [R=403,L]

我意识到(使用 Chrome 的 DevTools)我真的无法在请求 header 中看到此标记。

Headers Screenshot

我明白这是因为第一个 RewriteRule 不会在客户端触发重定向,所有这些重写过程都发生在服务器上。

如果我是对的,这个 SECRET_TOKEN 是安全的,不是吗? (安全,我的意思是客户无法以任何方式知道它)

最佳答案

通常,客户端永远不会看到 SECRET_TOKEN - 正如您所说,重写是服务器内部的。

但是,有可能 SECRET_TOKEN可能会在特定条件下暴露,具体取决于服务器配置。

例如,使用您发布的代码,SECRET_TOKEN可以通过请求 example.com/public 来暴露或 example.com/subdir (其中 subdir/public 内的子目录)- 注意省略了尾部斜杠。

  1. example.com/public - 如果您请求 /public (没有尾部斜杠)然后 mod_dir 通过附加一个尾部斜杠来“纠正”这个问题,这是通过 301 外部重定向实现的。但是,重定向不会立即发生,您的 RewriteRule指令最终将此请求重写(因为此时 REQUEST_URI 变量仍然是 /public - 没有尾部斜杠)到 /public/?token=SECRET_TOKEN (注意现在目录上的尾部斜杠)。 (出于某种原因,RewriteRule 似乎没有更新 URL 路径,因为您可能希望这是 /public/public,但是,查询字符串仍然附加。可能与 mod_dir 发出的子请求有关?不知道为什么?)由于 301 已被 mod_dir 触发,此响应(包含 SECRET_TOKEN)现在作为 外部重定向SECRET_TOKEN 发送回用户暴露了。

  2. example.com/subdir - 如果有子目录 /public/subdir,则会发生类似(但略有不同)的事情你请求了/subdir (没有尾部斜线)。你的RewriteRule这次指令首先启动并在内部将请求重写为 /public/subdir?token=SECRET_TOKEN .好的到目前为止。但随后 mod_dir 介入并希望在 /public/subdir 后附加一个斜线。 - 它通过外部 301 重定向来实现。所以请求现在被重定向/public/subdir/?token=SECRET_TOKENSECRET_TOKEN向用户公开(以及以前未知的 /public 子目录)。

但是,以这种方式使用查询字符串还有一些其他注意事项:

  1. 就目前而言,您正在覆盖请求中的任何其他查询字符串。

  2. 要合并请求中的现有查询字符串,您需要指定 QSA RewriteRule 上的旗帜.但是,如果用户随后附加了 ?token=根据请求,他们将覆盖您的 token URL 参数,如果您想使用 $_GET 阅读此内容PHP 脚本中的超全局。您可以通过显式包含 QUERY_STRING 来手动更改查询字符串参数的顺序替换中的服务器变量而不是使用 QSA 标志 - 但这有点困惑(例如,如果没有查询字符串怎么办?)。

关于apache - 在 htaccess 重写规则中附加一个 secret token 作为查询字符串有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com