nuxt-security
Version:
🛡️ Security Module for Nuxt based on HTTP Headers and Middleware
45 lines (44 loc) • 1.75 kB
JavaScript
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);
}
}
}
}
}
});