
    ghE/                        d Z ddlZddlZddlZddlmZ  ej                  e      Z G d d      Z	dde
dede
fd	Zed
k(  r ej                  ej                         dZ ed ee               ed ee	j%                  e                    dZ ed ee               ed ee	j%                  e                    e	j)                  d      Z ede        dZ ede	j/                  e              yy)u   
Módulo de Sanitización de Inputs Unicode
Protege contra ataques de homógrafos, zero-width characters y caracteres de control
    N)Optionalc                   N   e Zd ZdZg dZg dZi dddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&ddd	d'ddd(dddd)dd*d+Ze	 	 	 d9d,ed-e	d.e
d/e
d0ef
d1       Zed,ed0d2fd3       Zed:d4ed-e	d0efd5       Zed;d6ed-e	d0efd7       Zed,ed0efd8       Zy2)<InputSanitizerz-Sanitiza inputs para prevenir ataques Unicode)u   ​u   ‌u   ‍   ‎   ‏u   ﻿u   ⁠u   ⁡u   ⁢u   ⁣u   ⁤) u   АAu   ВBu   ЕEu   КKu   МMu   НHu   ОOu   РPu   СCu   ТTu   ХXu   аau   еeu   оou   рpu   сcu   уyxINYZ)u   хu   Αu   Βu   Εu   Ιu   Κu   Μu   Νu   Οu   Ρu   Τu   Υu   Χu   Ζtext
max_lengthallow_newlinesstrict_modereturnc                    t        |t              st        d      |r|j                         syt	        j
                  d|      }| j                  D ]  }|j                  |d      } | j                  D ]  }|j                  |d      } |}| j                  j                         D ]  \  }}|j                  ||      } ||k7  rt        j                  d       t        j                  dd|      }|r:|j                  dd      j                  d	d      }t        j                  d
d|      }n"|j                  dd      j                  d	d      }|r-dj                  d |D              }t        j!                  d       | j#                  |       t%        |      |kD  r*t        j                  dt%        |       d| d       |d| }|j                         }|S )u  
        Sanitiza texto completo aplicando múltiples capas de seguridad.
        
        Args:
            text: Texto a sanitizar
            max_length: Longitud máxima permitida
            allow_newlines: Si se permiten saltos de línea (
)
            strict_mode: Modo estricto que elimina caracteres no-ASCII
            
        Returns:
            Texto sanitizado y seguro
            
        Raises:
            ValueError: Si el texto es inválido o contiene patrones peligrosos
        z%El input debe ser una cadena de texto NFCu4   ⚠️ Homógrafos Unicode detectados y reemplazadosz[ \t]+ z

r	   z\n{3,}z

c              3   >   K   | ]  }t        |      d k  s|  yw)   N)ord).0chars     M/var/www/dev.catia.catastroantioquia-mas.com/tasa/security/input_sanitizer.py	<genexpr>z*InputSanitizer.sanitize.<locals>.<genexpr>   s     DDCIO4Ds   z-Modo estricto: caracteres no-ASCII eliminadoszTexto truncado de z a z caracteresN)
isinstancestr
ValueErrorstripunicodedata	normalize
ZERO_WIDTHreplaceCONTROL_CHARSHOMOGRAPH_MAPitemsloggerwarningresubjoininfo_detect_suspicious_charslen)	clsr#   r$   r%   r&   r1   original_text	homographreplacements	            r2   sanitizezInputSanitizer.sanitizeV   s   0 $$DEE4::< $$UD1 NN 	*D<<b)D	*
 %% 	*D<<b)D	*
 &)&7&7&=&=&? 	8"I{<<	;7D	8 = NNQR vvid+ <<-55dDAD66)VT2D <<c*224=D 77DDDDDKKGH 	$$T* t9z!NN/D	{#j\UV$D zz|    Nc                 ,   g }|D ]o  }t        j                  |      }|j                  d      r#|dvr|j                  dt	        |      d       L|dk(  sR|j                  dt	        |      d       q |rt
        j                  d|dd	         yy)
zP
        Detecta y loguea caracteres sospechosos sin bloquear el texto.
        r   )r,   	r+   zControl char: U+04XCfzFormat char: U+u*   ⚠️ Caracteres sospechosos detectados: N   )r8   category
startswithappendr/   r?   r@   )rG   r#   suspicious_categoriesr1   rR   s        r2   rE   z'InputSanitizer._detect_suspicious_chars   s    
 !# 		PD"++D1H ""3'D8I,I%,,/?D	#-OPT!%,,s4yo-NO		P !NNGH]^`_`HaGbcd !rL   
session_idc                    t        |t              st        d      | j                  ||dd      }t	        j
                  d|      s,t        j                  d       t	        j                  dd|      }|st        d      |S )	uk   
        Sanitización específica para Session IDs.
        Más estricta que sanitize() general.
        z'Session ID debe ser una cadena de textoFr$   r%   r&   z	^[\w\-]+$z,Session ID contiene caracteres no permitidosz[^\w\-]r)   u.   Session ID inválido después de sanitización)	r4   r5   r6   rK   rA   matchr?   r@   rB   )rG   rV   r$   	sanitizeds       r2   sanitize_session_idz"InputSanitizer.sanitize_session_id   s     *c*FGG LL! 	 ! 
	 xxi0NNIJz2y9IMNNrL   preguntac                     t        |t              st        d      | j                  ||dd      }|st        d      t	        |      dk  rt        d      |S )ux   
        Sanitización específica para preguntas de usuario.
        Permite más flexibilidad que session_id.
        z%Pregunta debe ser una cadena de textoTFrX   u)   Pregunta vacía después de sanitización   zPregunta demasiado corta)r4   r5   r6   rK   rF   )rG   r\   r$   rZ   s       r2   sanitize_preguntaz InputSanitizer.sanitize_pregunta   sl     (C(DEE LL!	 ! 
	 HII y>A788rL   c                 t   ddddg d}| j                   D ]  }||v sd|d<    n | j                  D ]  }||v sd|d<    n | j                  j                         D ]  }||v sd|d<    n g d}|D ]  }||v sd|d<    n |D ]2  }t	        |      d	kD  s|d
   j                  dt	        |      d       4 |S )up   
        Detecta posibles ataques Unicode y retorna un reporte.
        Útil para logging y análisis.
        F)has_zero_widthhas_control_charshas_homographshas_rtl_markssuspicious_charsTra   rb   rc   )r   r   u   ‪u   ‫u   ‬u   ‭u   ‮rd   i  re   zU+rO   )r:   r<   r=   keysr/   rT   )rG   r#   reportr1   rI   	rtl_marksmarks          r2   detect_unicode_attacksz%InputSanitizer.detect_unicode_attacks   s    $!&#" "
 NN 	Dt|+/'(	 %% 	Dt|.2*+	 **//1 	ID +/'(	 [	 	Dt|*.'	  	HD4y6!)*11Bs4yo2FG	H rL   )  TF)d   )i  )__name__
__module____qualname____doc__r:   r<   r=   classmethodr5   intboolrK   rE   r[   r_   dictrj    rL   r2   r   r      s
   7
JM%c% 	c% 	c	%
 	c% 	c% 	c% 	c% 	c% 	c% 	c% 	c% 	c%  	c!%" 	c#%$ 	c%%& 	c'%( 	c)%*  I%MR  #!TT T 	T
 T 
T Tp eC eD e e( S c C  8  #   2 +# +$ + +rL   r   r#   r$   r'   c                 0    t         j                  | |      S )u>   
    Función de conveniencia para sanitización rápida.
    )r$   )r   rK   )r#   r$   s     r2   sanitize_inputrw   ,  s     ""4J"??rL   __main__)levelu   Hola​mundozAntes: u
   Después: u   АВСz
Antes: u   Hola​mundo АВСz
Reporte de ataques: u   session_123​_testz
Session ID sanitizado: )rk   )rp   r8   rA   loggingtypingr   	getLoggerrm   r?   r   r5   rr   rw   basicConfigINFOtexto_malicioso1printreprrK   texto_malicioso2rj   reporterV   r[   ru   rL   r2   <module>r      s<  
  	  			8	$Y Y|@ @# @ @ zGgll+ )	GD)*+
,-	JtN334DEFG
HI  	Id+,-
./	JtN334DEFG
HI 334LMG	"7)
,- *J	%n&H&H&T%U
VW) rL   