import { registerDecorator, ValidationOptions, ValidationArguments, } from 'class-validator'; // Decorator para sanitizar strings e prevenir SQL/NoSQL injection export function IsSanitized(validationOptions?: ValidationOptions) { return function (object: object, propertyName: string) { registerDecorator({ name: 'isSanitized', target: object.constructor, propertyName: propertyName, options: validationOptions, validator: { validate(value: any, args: ValidationArguments) { if (typeof value !== 'string') return true; // Skip non-string values const sqlInjectionRegex = /('|"|;|--|\/\*|\*\/|@@|@|char|nchar|varchar|nvarchar|alter|begin|cast|create|cursor|declare|delete|drop|end|exec|execute|fetch|insert|kill|open|select|sys|sysobjects|syscolumns|table|update|xp_)/i; if (sqlInjectionRegex.test(value)) { return false; } // Check for NoSQL injection patterns (MongoDB) const noSqlInjectionRegex = /(\$where|\$ne|\$gt|\$lt|\$gte|\$lte|\$in|\$nin|\$or|\$and|\$regex|\$options|\$elemMatch|\{.*\:.*\})/i; if (noSqlInjectionRegex.test(value)) { return false; } // Check for XSS attempts const xssRegex = /( 0; }, defaultMessage(args: ValidationArguments) { return 'O ID fornecido não é seguro ou está em formato inválido'; }, }, }); }; }