
    (<i;                         U d Z ddlZddlmZmZ e G d d             Ze G d d             Zdd	d
dddddddddZee	e	f   e
d<   g dZeee	e	e	f      e
d<   de	defdZg dZ G d de      Zde	defdZy)u  프롬프트 인젝션 탐지 모듈.

텍스트에서 프롬프트 인젝션 패턴(텍스트 기반 + 유니코드)을 탐지합니다.
Hermes Agent의 _scan_context_content() 로직을 참고하여 dev2-team 시스템에 맞게 재설계.

Usage:
    from utils.injection_guard import scan_content
    result = scan_content("some text")
    if not result.is_safe:
        for threat in result.threats:
            print(threat.pattern_name, threat.severity)
    N)	dataclassfieldc                   0    e Zd ZU dZeed<   eed<   eed<   y)
ThreatInfou   개별 위협 정보.pattern_namematched_textseverityN)__name__
__module____qualname____doc__str__annotations__     F/home/jay/workspace/.worktrees/task-2057-dev2/utils/injection_guard.pyr   r      s    Mr   r   c                   >    e Zd ZU dZeed<    ee      Zee	   ed<   y)
ScanResultu   스캔 결과.is_safe)default_factorythreatsN)
r
   r   r   r   boolr   r   listr   r   r   r   r   r   r      s    M %d ;GT*;r   r   zZWSP (U+200B)zZWNJ (U+200C)zZWJ (U+200D)zRTL_MARK (U+200F)zWORD_JOINER (U+2060)zBOM (U+FEFF)zLRE (U+202A)zRLE (U+202B)zPDF (U+202C)zLRO (U+202D)zRTL_OVERRIDE (U+202E))u   ​u   ‌u   ‍u   ‏u   ⁠u   ﻿u   ‪u   ‫u   ‬u   ‭u   ‮_INVISIBLE_UNICODE))z2ignore\s+(previous|all|above|prior)\s+instructionsignore_instructionshigh)z)forget\s+(your|all|my|the)\s+instructionsforget_instructionsr   )zyou\s+are\s+now\byou_are_nowr   )z\bjailbreak\b	jailbreakr   )zsystem\s+promptsystem_promptmedium)z\bact\s+as\bact_asr!   )zpretend\s+(you\s+are|to\s+be)pretend_you_arer!   )z\boverride\boverrider!   )z
\bbypass\bbypassr!   )z<disregard\s+(your|all|any)\s+(instructions|rules|guidelines)disregard_rulesr   )z9<!--[^>]*(?:ignore|override|system|secret|hidden)[^>]*-->html_comment_injectionr   )z#\b(curl|wget)\b[^\n]*\|\s*(ba)?sh\bremote_executer   _TEXT_PATTERNStextreturnc                    g }t         j                         D ]Z  \  }}|| v s|j                  t        d|j	                         d   j                          dt        |      dd| dd             \ t        D ]k  \  }}}t        j                  || t        j                  t        j                  z        }|s@|j                  t        ||j                  d      |             m t        t        |      dk(  |	      S )
u   텍스트에서 프롬프트 인젝션 패턴을 탐지합니다.

    Args:
        text: 검사할 문자열.

    Returns:
        ScanResult: is_safe=False이면 threats 목록에 탐지된 위협 포함.
    invisible_unicode_r   zU+04Xz ()r   )r   r   r	   )r   r   )r   itemsappendr   splitlowerordr)   research
IGNORECASEDOTALLgroupr   len)r*   r   charnamepatternr   r	   matchs           r   scan_contentr?      s     !#G )..0 
d4<NN#5djjl1o6K6K6M5N!O#%c$i_BtfA!># ,: 	'x		'4)BCNN!-!&Q%	 c'la/AAr   )r   r   InjectionBlockedErrorr?   check_contentc                   2     e Zd ZdZdee   ddf fdZ xZS )r@   u   프롬프트 인젝션이 탐지되어 처리가 차단됨.

    check_content()가 high severity 위협을 1개 이상 발견했을 때 발생합니다.

    Attributes:
        threats: 탐지된 모든 위협 목록 (ThreatInfo 리스트).
    r   r+   Nc                     || _         |D cg c]  }|j                  dk(  s| }}t        |      }|r|d   j                  n|d   j                  }t        |   d| d|       y c c}w )Nr   r   u   인젝션 차단: u0   개의 위협 패턴 탐지, 첫 번째 패턴: )r   r	   r:   r   super__init__)selfr   thigh_threatscount
first_name	__class__s         r   rE   zInjectionBlockedError.__init__   ss    #*CaajjF.BCCL!5A\!_11wqzG^G^
-eW4deodrst Ds
   A)A))r
   r   r   r   r   r   rE   __classcell__)rK   s   @r   r@   r@      s)    uZ 0 uT u ur   r@   c                     t        |       }|j                  s@|j                  D cg c]  }|j                  dk(  s| }}|rt	        |j                        |S c c}w )u/  텍스트에서 프롬프트 인젝션을 탐지하고 위협 발견 시 즉시 차단합니다 (하드블록).

    내부에서 scan_content()를 호출하여 탐지 후, high severity 위협이 1개 이상이면
    InjectionBlockedError를 발생시킵니다. 안전한 텍스트는 ScanResult를 반환합니다.

    Args:
        text: 검사할 문자열.

    Returns:
        ScanResult: 위협이 없을 경우 is_safe=True인 ScanResult 반환.

    Raises:
        InjectionBlockedError: high severity 위협이 1개 이상 탐지된 경우.
    r   )r?   r   r   r	   r@   )r*   resultrG   rH   s       r   rA   rA      sT     $F>>#)>>JaQZZ65IJJ'77M Ks
   AA)r   r5   dataclassesr   r   r   r   r   dictr   r   r)   r   tupler?   __all__	Exceptionr@   rA   r   r   r   <module>rT      s    
 (    < < < !$%& DcN $I.U3S=)* IX"Bs "Bz "BJuI u" 
 r   