Keywords: JavaScript | XMLHttpRequest | Request Header Security
Abstract: This article provides an in-depth analysis of security restrictions when setting request headers in JavaScript using XMLHttpRequest, focusing on sensitive headers like User-Agent and Referer. By examining W3C specifications and browser implementation differences, it explains why certain headers cannot be modified and offers practical code examples using alternatives such as X-Alt-Referer. The discussion also covers cross-browser compatibility and comparisons with the modern Fetch API, delivering comprehensive technical guidance for developers.
XMLHttpRequest Request Header Setting Mechanism
When making AJAX calls in JavaScript, the setRequestHeader method of the XMLHttpRequest object allows developers to customize HTTP request headers. However, browsers impose strict restrictions on certain sensitive header fields for security reasons.
W3C Specification Analysis
According to the W3C XMLHttpRequest specification, the behavior of the setRequestHeader method is clearly defined: if a request header has already been set, the new value must be concatenated to the existing value using a U+002C comma and U+0020 space. Notably, user agents (UA) may provide an initial value for the User-Agent header but must allow authors to append values to it.
Browser Security Restrictions in Practice
In actual browser implementations, security policies limit the ability to modify specific headers. For example, in Firefox, attempting to set the Referer header does not result in the value being sent; setting the User-Agent header can completely break the AJAX call. This design prevents malicious scripts from forging request origins and user agent information.
Examples of Viable Header Settings
Standard headers such as Accept and Content-Type can be set normally:
var request = new XMLHttpRequest();
request.open("GET", "http://example.com", true);
request.setRequestHeader("Accept", "text/plain");
request.setRequestHeader("Content-Type", "text/plain");
request.send(null);
Alternative Solutions and Best Practices
For scenarios requiring Referer-like information, it is recommended to use custom headers:
request.setRequestHeader("X-Alt-Referer", "http://www.google.com");
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
The server can parse these custom headers to obtain the necessary information while avoiding browser security restrictions.
Comparison with Modern APIs
Compared to the traditional XMLHttpRequest, the modern Fetch API is subject to similar security restrictions. Developers should understand the underlying reasons for these limitations and adopt solutions that comply with security specifications in application design.