Skip to content

Commit ade8792

Browse files
authored
Merge pull request #61 from kumanote/master
fix: cross-site post form submissions are forbidden when using load balancer in front
2 parents e0a5189 + 92cc1ae commit ade8792

File tree

5 files changed

+32
-24
lines changed

5 files changed

+32
-24
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.DS_Store
22
node_modules
3-
/files
3+
/files
4+
.idea/

bun.lockb

0 Bytes
Binary file not shown.

src/env.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const expected = new Set([
66
"ADDRESS_HEADER",
77
"PROTOCOL_HEADER",
88
"HOST_HEADER",
9+
"PORT_HEADER",
910
"SERVERDEV",
1011
]);
1112
export const build_options = BUILD_OPTIONS;

src/handler.js

+27-21
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const origin = env("ORIGIN", undefined);
2121
const address_header = env("ADDRESS_HEADER", "").toLowerCase();
2222
const protocol_header = env("PROTOCOL_HEADER", "").toLowerCase();
2323
const host_header = env("HOST_HEADER", "host").toLowerCase();
24+
const port_header = env("PORT_HEADER", "").toLowerCase();
2425

2526
/** @param {boolean} assets */
2627
export default function (assets) {
@@ -94,26 +95,26 @@ function serve(path, client = false) {
9495

9596
/**@param {Request} request */
9697
function ssr(request) {
97-
if (origin) {
98-
const requestOrigin = get_origin(request.headers);
99-
if (origin !== requestOrigin) {
100-
const url = request.url.slice(request.url.split("/", 3).join("/").length);
101-
request = new Request(origin + url, {
102-
method: request.method,
103-
headers: request.headers,
104-
body: request.body,
105-
referrer: request.referrer,
106-
referrerPolicy: request.referrerPolicy,
107-
mode: request.mode,
108-
credentials: request.credentials,
109-
cache: request.cache,
110-
redirect: request.redirect,
111-
integrity: request.integrity,
112-
});
113-
}
114-
}
98+
const baseOrigin = origin || get_origin(request.headers);
99+
const url = request.url.slice(request.url.split("/", 3).join("/").length);
100+
request = new Request(baseOrigin + url, {
101+
method: request.method,
102+
headers: request.headers,
103+
body: request.body,
104+
referrer: request.referrer,
105+
referrerPolicy: request.referrerPolicy,
106+
mode: request.mode,
107+
credentials: request.credentials,
108+
cache: request.cache,
109+
redirect: request.redirect,
110+
integrity: request.integrity,
111+
});
115112

116-
if (address_header && !request.headers.has(address_header)) {
113+
if (
114+
address_header &&
115+
request.headers.get(host_header) !== "127.0.0.1" &&
116+
!request.headers.has(address_header)
117+
) {
117118
throw new Error(
118119
`Address header was specified with ${
119120
ENV_PREFIX + "ADDRESS_HEADER"
@@ -123,7 +124,7 @@ function ssr(request) {
123124

124125
return server.respond(request, {
125126
getClientAddress() {
126-
if (address_header) {
127+
if (address_header && request.headers.get(host_header) !== "127.0.0.1") {
127128
const value = /** @type {string} */ (request.headers.get(address_header)) || "";
128129

129130
if (address_header === "x-forwarded-for") {
@@ -162,5 +163,10 @@ function ssr(request) {
162163
function get_origin(headers) {
163164
const protocol = (protocol_header && headers.get(protocol_header)) || "https";
164165
const host = headers.get(host_header);
165-
return `${protocol}://${host}`;
166+
const port = port_header && headers[port_header];
167+
if (port) {
168+
return `${protocol}://${host}:${port}`;
169+
} else {
170+
return `${protocol}://${host}`;
171+
}
166172
}

src/sirv.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ export default function (dir, opts = {}) {
234234
data = {
235235
...data,
236236
// clone a new headers to prevent the cached one getting modified
237-
headers: new Headers(data.headers)
238-
}
237+
headers: new Headers(data.headers),
238+
};
239239

240240
if (gzips || brots) {
241241
data.headers.append("Vary", "Accept-Encoding");

0 commit comments

Comments
 (0)