随着几天前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
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']