Initial commit
This commit is contained in:
132
utils/inputSanitizer.ts
Normal file
132
utils/inputSanitizer.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
/**
|
||||
* Utilitaires de sanitisation pour les entrées utilisateur côté frontend
|
||||
*/
|
||||
|
||||
export class InputSanitizer {
|
||||
/**
|
||||
* Encode les entités HTML pour prévenir XSS
|
||||
*/
|
||||
static encodeHtml(input: string): string {
|
||||
if (!input) return input;
|
||||
|
||||
const div = document.createElement('div');
|
||||
div.textContent = input;
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime les balises HTML dangereuses
|
||||
*/
|
||||
static stripHtml(input: string): string {
|
||||
if (!input) return input;
|
||||
|
||||
return input.replace(/<[^>]*>/g, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise un email
|
||||
*/
|
||||
static sanitizeEmail(email: string): string {
|
||||
if (!email) return email;
|
||||
|
||||
return email.trim().toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise un nom/prénom
|
||||
*/
|
||||
static sanitizeName(name: string): string {
|
||||
if (!name) return name;
|
||||
|
||||
// Supprimer les caractères dangereux
|
||||
let sanitized = name.replace(/[<>'"&]/g, '');
|
||||
|
||||
// Garder seulement les lettres, espaces, tirets et apostrophes
|
||||
sanitized = sanitized.replace(/[^a-zA-ZàáâäçéèêëíìîïñóòôöúùûüÿýÀÁÂÄÇÉÈÊËÍÌÎÏÑÓÒÔÖÚÙÛÜŸÝ\s'-]/g, '');
|
||||
|
||||
return sanitized.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise un numéro de téléphone
|
||||
*/
|
||||
static sanitizePhone(phone: string): string {
|
||||
if (!phone) return phone;
|
||||
|
||||
// Garder seulement les chiffres et le + au début
|
||||
return phone.replace(/[^0-9+]/g, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise une adresse
|
||||
*/
|
||||
static sanitizeAddress(address: string): string {
|
||||
if (!address) return address;
|
||||
|
||||
// Supprimer les caractères dangereux
|
||||
let sanitized = address.replace(/[<>'"&]/g, '');
|
||||
|
||||
// Garder les caractères alphanumériques et ponctuation courante
|
||||
sanitized = sanitized.replace(/[^a-zA-Z0-9àáâäçéèêëíìîïñóòôöúùûüÿýÀÁÂÄÇÉÈÊËÍÌÎÏÑÓÒÔÖÚÙÛÜŸÝ\s,.-]/g, '');
|
||||
|
||||
return sanitized.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Valide qu'une entrée ne contient pas de code malveillant
|
||||
*/
|
||||
static isInputSafe(input: string): boolean {
|
||||
if (!input) return true;
|
||||
|
||||
const dangerousPatterns = [
|
||||
/<script[^>]*>.*?<\/script>/gi,
|
||||
/javascript:/gi,
|
||||
/vbscript:/gi,
|
||||
/onload=/gi,
|
||||
/onerror=/gi,
|
||||
/onclick=/gi,
|
||||
/onmouseover=/gi,
|
||||
/eval\(/gi,
|
||||
/expression\(/gi,
|
||||
];
|
||||
|
||||
return !dangerousPatterns.some(pattern => pattern.test(input));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitise une entrée générique
|
||||
*/
|
||||
static sanitize(input: string): string {
|
||||
if (!input) return input;
|
||||
|
||||
// Supprimer les balises HTML
|
||||
let sanitized = this.stripHtml(input);
|
||||
|
||||
// Encoder les entités HTML
|
||||
sanitized = this.encodeHtml(sanitized);
|
||||
|
||||
return sanitized.trim();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook React pour la sanitisation automatique des inputs
|
||||
*/
|
||||
export function useSanitizedInput(initialValue: string = '') {
|
||||
const [value, setValue] = React.useState(initialValue);
|
||||
|
||||
const setSanitizedValue = (newValue: string) => {
|
||||
const sanitized = InputSanitizer.sanitize(newValue);
|
||||
setValue(sanitized);
|
||||
};
|
||||
|
||||
return [value, setSanitizedValue] as const;
|
||||
}
|
||||
|
||||
// Import React pour le hook (si disponible)
|
||||
let React: any;
|
||||
try {
|
||||
React = require('react');
|
||||
} catch (e) {
|
||||
// React non disponible, le hook ne sera pas utilisable
|
||||
}
|
||||
Reference in New Issue
Block a user