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

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

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

特别是,我需要排除在查询中提供带有哈希键的操作的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

yanhong123456 回答:从Opera地址栏中拒绝服务器端(PHP或Apache)上的Fetch API请求

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']

本文链接:https://www.f2er.com/3010432.html

大家都在问