从Opera地址栏中的服务器端(PHP或Apache)上的Deny Fetch API请求

问题描述 投票:-1回答:1

随着几天前address bar redesign出现了新的Opera 65,我在我的网页上注意到了一个问题。在酒吧里输入或复制地址时,Opera将请求发送到服务器,但是,我无法用PHP捕获请求,因为Fetch API似乎在后台使用。

是否有任何方法可以拒绝或阻止Fetch API请求在PHP 7或Apache 2.4中?换句话说,在输入/复制时阻止Opera在服务器端产生的请求(首选PHP)?

特别是,我需要排除在查询中提供带有hash key操作的GET请求(下面是示例中的test)。当地址被复制(例如从邮件中复制到地址栏)时,Opera“在后台”发送请求,该请求被执行,但是通过Enter提交地址后,由于禁止操作(< [哈希键不再有效。

从Apache日志:

127.0.0.1 - - [29/Nov/2019:01:56:08 +0100] "GET /? HTTP/1.1" 200 179736 127.0.0.1 - - [29/Nov/2019:01:56:08 +0100] "GET /?t HTTP/1.1" 200 179813 127.0.0.1 - - [29/Nov/2019:01:56:08 +0100] "GET /?te HTTP/1.1" 200 179808 127.0.0.1 - - [29/Nov/2019:01:56:08 +0100] "GET /?tes HTTP/1.1" 200 179819 127.0.0.1 - - [29/Nov/2019:01:56:08 +0100] "GET /?test HTTP/1.1" 200 179823

从Wireshark(请求之一):

/?test HTTP/1.1 Host: sk.localhost Connection: keep-alive Sec-Fetch-Site: none Sec-Fetch-Mode: no-cors User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 OPR/65.0.3467.48 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9

[二手技术:PHP 7.3.7,Apache / 2.4.39
php apache opera fetch-api
1个回答
0
投票
可以通过Apache重写条件或基于已解析标头的PHP响应来拒绝(发送响应)请求。>

Opera在键入时发送两个Fetch API标头:

Sec-Fetch-Site:无安全提取模式:无错误]

所有标题的列表可以在https://w3c.github.io/webappsec-fetch-metadata/中找到。

为了不发送带有此标头的请求的完整响应(不使用PHP),可以使用Apache 2.4 mod重写模块:

RewriteCond %{HTTP:Sec-Fetch-Site} ^none$ [NC] RewriteCond %{HTTP:Sec-Fetch-Mode} ^no-cors$ [NC] RewriteRule ^ - [R=204,L]

或通过PHP发送响应(使用Kohana / Koseven FW的示例:]:>

$header_sec_fetch_site = $this->request->headers('Sec-Fetch-Site'); $header_sec_fetch_mode = $this->request->headers('Sec-Fetch-Mode'); if (isset($header_sec_fetch_site, $header_sec_fetch_mode) && $header_sec_fetch_site == 'none' && $header_sec_fetch_mode == 'no-cors') { $message = 'Header ' . $header_sec_fetch_mode . ' received. No content for this request.'; Log::instance()->add(Log::NOTICE, $message); throw HTTP_Exception::factory(204, $message, array( ':uri' => Request::current()->uri(), )); }

标题应该在全局变量中可用:

$ _ SERVER ['HTTP_SEC_FETCH_DEST']$ _SERVER ['HTTP_SEC_FETCH_SITE']$ _SERVER ['HTTP_SEC_FETCH_USER']$ _SERVER ['HTTP_SEC_FETCH_MODE']
© www.soinside.com 2019 - 2024. All rights reserved.