UNPKG

nuxt-security

Version:

🛡️ Security Module for Nuxt based on HTTP Headers and Middleware

45 lines (44 loc) 1.75 kB
import { defineEventHandler, createError, getQuery, readBody, readMultipartFormData } from "h3"; import { FilterXSS } from "xss"; import { resolveSecurityRules } from "../../nitro/context/index.js"; export default defineEventHandler(async (event) => { const rules = resolveSecurityRules(event); if (rules.enabled && rules.xssValidator) { const filterOpt = { ...rules.xssValidator, escapeHtml: void 0 }; if (rules.xssValidator.escapeHtml === false) { filterOpt.escapeHtml = (value) => value; } const xssValidator = new FilterXSS(filterOpt); if (event.node.req.socket.readyState !== "readOnly") { if (rules.xssValidator.methods && rules.xssValidator.methods.includes( event.node.req.method )) { const valueToFilter = event.node.req.method === "GET" ? getQuery(event) : event.node.req.headers["content-type"]?.includes( "multipart/form-data" ) ? await readMultipartFormData(event) : await readBody(event); if (valueToFilter && Object.keys(valueToFilter).length) { if (valueToFilter.statusMessage && valueToFilter.statusMessage !== "Bad Request") { return; } const stringifiedValue = JSON.stringify(valueToFilter); const processedValue = xssValidator.process( JSON.stringify(valueToFilter) ); if (processedValue !== stringifiedValue) { const badRequestError = { statusCode: 400, statusMessage: "Bad Request" }; if (rules.xssValidator.throwError === false) { return badRequestError; } throw createError(badRequestError); } } } } } });