Kalan's Blog

Kalan 頭像照片,在淡水拍攝,淺藍背景

四零二曜日電子報上線啦!訂閱訂起來

Software Engineer / Taiwanese / Life in Fukuoka
This blog supports RSS feed (all content), you can click RSS icon or setup through third-party service. If there are special styles such as code syntax in the technical article, it is still recommended to browse to the original website for the best experience.

Current Theme light

我會把一些不成文的筆記或是最近的生活雜感放在短筆記,如果有興趣的話可以來看看唷!

Please notice that currenly most of posts are translated by AI automatically and might contain lots of confusion. I'll gradually translate the post ASAP

Safer Request Headers - Fetch Metadata Request Headers

One day, while developing a web page, I opened the developer tools to check if the request headers were correct. To my surprise, I noticed a few suspicious headers:

network

Did you notice anything suspicious? Upon closer inspection, I found three headers starting with Sec-Fetch-*. This caught my attention because I didn't set these headers or use any other functions. I wondered why these headers were automatically added, and my guess was that it was the browser's doing.

After searching on Google, I discovered that this is a new draft called Fetch Metadata Request Headers. Currently, only Chrome adds these headers, while Firefox and Safari do not.

Discussing Cross-Origin Resource Sharing (CORS)

As we know, browsers have restrictions in place to prevent malicious individuals from accessing your data through unusual methods. For example, cross-origin requests require the addition of Access-Control-Allow-Origin or Preflight requests. You can find more details in my previous article, "Dealing with CORS and Cookies."

Despite these measures, there are still some flaws. For instance, <img/> tags can still make cross-origin requests, allowing malicious actors to bypass CORS restrictions. Of course, if the server has implemented basic protective measures, it can block most insecure requests.

By adding additional header information (metadata) when sending requests, servers can respond accordingly based on these headers. This gave rise to the aforementioned draft.

Header Specifications:

Currently, there are four main headers in the draft:

1. Sec-Fetch-Dest

This header indicates the destination of the request.

Possible values include audio, document, font, image, object, serviceworker, and more. With these headers, the server can quickly determine if the request source is legitimate. For example, if the source is an <img> tag but not requesting an image from the server, it's highly likely to be a hacker, and we can respond with an error message.

2. Sec-Fetch-Mode

This header represents the mode of the request. Possible values are cors, navigate, nested-navigate, no-cors, and more, similar to the fetch mode.

We can also determine if the request was initiated by user interaction, such as a click or keyboard input, using Set-Fetch-User.

3. Sec-Fetch-Site

This header indicates whether the request source is same-origin or cross-origin.

4. Sec-Fetch-User

This header's value is a boolean. It is only true for navigation requests (requests that target a document) with user interaction, such as button clicks or keyboard inputs. Servers can use this header to determine the legitimacy of the user-triggered request.

For example, when submitting a form by clicking a button, since the request is sent by the document and there is user interaction (button click), Set-Fetch-User will be ?T.

Can the headers be removed?

If this becomes a standard, it may not be possible to remove them. Additionally, you cannot manually modify the header values as they are part of the forbidden headers.

Conclusion

In the past, similar tasks were achieved using custom headers for prevention. However, these headers could still be forged, and using custom headers required preflight checks, adding extra work. Starting from a specification has the advantage that these headers cannot be easily tampered with, and it provides a standardized approach. With these headers, the backend can make additional checks upon receiving requests, thereby enhancing security.

Prev

How to collect and centralize logs in golang app

Next

Implementing the pin to bottom component via overflow-anchor

If you found this article helpful, please consider buy me a drink ☕️ It'll make my ordinary day shine✨

Buy me a coffee