Skip to content

Commit 7eeb910

Browse files
committed
fix(vite,webpack): restrict access via cors to local origins + allow configuration via devServer.cors
1 parent be8cd3e commit 7eeb910

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

Diff for: packages/schema/src/config/dev.ts

+8
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,13 @@ export default defineUntypedSchema({
3939
* @type {(data: { loading?: string }) => string}
4040
*/
4141
loadingTemplate,
42+
43+
/**
44+
* Set CORS options for the dev server
45+
* @type {typeof import('h3').H3CorsOptions}
46+
*/
47+
cors: {
48+
origin: [/^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/],
49+
},
4250
},
4351
})

Diff for: packages/vite/src/client.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { getPort } from 'get-port-please'
99
import { joinURL, withoutLeadingSlash } from 'ufo'
1010
import { defu } from 'defu'
1111
import { env, nodeless } from 'unenv'
12-
import { appendCorsHeaders, appendCorsPreflightHeaders, defineEventHandler } from 'h3'
12+
import { defineEventHandler, handleCors, setHeader } from 'h3'
1313
import type { ViteConfig } from '@nuxt/schema'
1414
import type { ViteBuildContext } from './vite'
1515
import { devStyleSSRPlugin } from './plugins/dev-ssr-css'
@@ -255,11 +255,11 @@ export async function buildClient (ctx: ViteBuildContext) {
255255
// @ts-expect-error _skip_transform is a private property
256256
event.node.req._skip_transform = true
257257
} else if (!useViteCors) {
258-
if (event.method === 'OPTIONS') {
259-
appendCorsPreflightHeaders(event, {})
258+
const isPreflight = handleCors(event, ctx.nuxt.options.devServer.cors)
259+
if (isPreflight) {
260260
return null
261261
}
262-
appendCorsHeaders(event, {})
262+
setHeader(event, 'Vary', 'Origin')
263263
}
264264

265265
// Workaround: vite devmiddleware modifies req.url

Diff for: packages/webpack/src/webpack.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pify from 'pify'
22
import { resolve } from 'pathe'
3-
import { defineEventHandler, fromNodeMiddleware } from 'h3'
3+
import { defineEventHandler, fromNodeMiddleware, handleCors, setHeader } from 'h3'
4+
import type { H3CorsOptions } from 'h3'
45
import type { IncomingMessage, MultiWatching, ServerResponse } from 'webpack-dev-middleware'
56
import webpackDevMiddleware from 'webpack-dev-middleware'
67
import webpackHotMiddleware from 'webpack-hot-middleware'
@@ -125,7 +126,7 @@ async function createDevMiddleware (compiler: Compiler) {
125126
})
126127

127128
// Register devMiddleware on server
128-
const devHandler = wdmToH3Handler(devMiddleware)
129+
const devHandler = wdmToH3Handler(devMiddleware, nuxt.options.devServer.cors)
129130
const hotHandler = fromNodeMiddleware(hotMiddleware)
130131
await nuxt.callHook('server:devHandler', defineEventHandler(async (event) => {
131132
const body = await devHandler(event)
@@ -139,8 +140,14 @@ async function createDevMiddleware (compiler: Compiler) {
139140
}
140141

141142
// TODO: implement upstream in `webpack-dev-middleware`
142-
function wdmToH3Handler (devMiddleware: webpackDevMiddleware.API<IncomingMessage, ServerResponse>) {
143+
function wdmToH3Handler (devMiddleware: webpackDevMiddleware.API<IncomingMessage, ServerResponse>, corsOptions: H3CorsOptions) {
143144
return defineEventHandler(async (event) => {
145+
const isPreflight = handleCors(event, corsOptions)
146+
if (isPreflight) {
147+
return null
148+
}
149+
setHeader(event, 'Vary', 'Origin')
150+
144151
event.context.webpack = {
145152
...event.context.webpack,
146153
devMiddleware: devMiddleware.context,

0 commit comments

Comments
 (0)