Skip to content

Commit 0e50072

Browse files
authored
Restrict access to .dev.vars files (#9513)
* Add failing tests * Deny acceess to .dev.vars and .dev.vars.* * Add changeset
1 parent 931f467 commit 0e50072

File tree

18 files changed

+165
-0
lines changed

18 files changed

+165
-0
lines changed

.changeset/nasty-pots-cheat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudflare/vite-plugin": patch
3+
---
4+
5+
Ensure that .dev.vars files cannot be accessed via the dev server or preview server.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DEV_VAR=dev-var
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
STAGING_DEV_VAR=staging-dev-var
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ENV_VAR=env-var
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
STAGING_ENV_VAR=staging-env-var
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
!.env*
2+
!.dev.vars*
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { describe, expect, test } from "vitest";
2+
import { getResponse, getTextResponse, isBuild } from "../../__test-utils__";
3+
4+
describe.skipIf(isBuild)("denies access to sensitive files in dev", () => {
5+
test("denies access to .env", async () => {
6+
const response = await getResponse("/.env");
7+
expect(response.status()).toBe(403);
8+
});
9+
10+
test("denies access to .env.*", async () => {
11+
const response = await getResponse("/.env.staging");
12+
expect(response.status()).toBe(403);
13+
});
14+
15+
test("denies access to .dev.vars", async () => {
16+
const response = await getResponse("/.dev.vars");
17+
expect(response.status()).toBe(403);
18+
});
19+
20+
test("denies access to .dev.vars.*", async () => {
21+
const response = await getResponse("/.dev.vars.staging");
22+
expect(response.status()).toBe(403);
23+
});
24+
25+
test("denies access to custom-sensitive-file", async () => {
26+
const response = await getResponse("/custom-sensitive-file");
27+
expect(response.status()).toBe(403);
28+
});
29+
});
30+
31+
describe.runIf(isBuild)("doesn't serve sensitive files in preview", () => {
32+
test("doesn't serve .env", async () => {
33+
const response = await getTextResponse("/.env");
34+
expect(response).toBe("Worker response");
35+
});
36+
37+
test("doesn't serve .env.*", async () => {
38+
const response = await getTextResponse("/.env.staging");
39+
expect(response).toBe("Worker response");
40+
});
41+
42+
test("doesn't serve .dev.vars", async () => {
43+
const response = await getTextResponse("/.dev.vars");
44+
expect(response).toBe("Worker response");
45+
});
46+
47+
test("doesn't serve .dev.vars.*", async () => {
48+
const response = await getTextResponse("/.dev.vars.staging");
49+
expect(response).toBe("Worker response");
50+
});
51+
52+
test("doesn't serve custom-sensitive-file", async () => {
53+
const response = await getTextResponse("/custom-sensitive-file");
54+
expect(response).toBe("Worker response");
55+
});
56+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Sensitive content
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "@playground/sensitive-files",
3+
"private": true,
4+
"type": "module",
5+
"scripts": {
6+
"build": "vite build",
7+
"check:types": "tsc --build",
8+
"dev": "vite dev",
9+
"preview": "vite preview"
10+
},
11+
"devDependencies": {
12+
"@cloudflare/vite-plugin": "workspace:*",
13+
"@cloudflare/workers-tsconfig": "workspace:*",
14+
"@cloudflare/workers-types": "^4.20250604.0",
15+
"typescript": "catalog:default",
16+
"vite": "catalog:vite-plugin",
17+
"wrangler": "workspace:*"
18+
}
19+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default {
2+
async fetch() {
3+
return new Response("Worker response");
4+
},
5+
} satisfies ExportedHandler;

0 commit comments

Comments
 (0)