Files
ai-g3sb-backman2.0/backend/utils/__pycache__/validators.cpython-312.pyc
T

152 lines
18 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
Èžáiô=ã
óÄ—dZddlZddlZddlmZmZmZmZeje «Z
ejd«Z de
defd„Zdefd„Zdefd „Zd
e
deeee
ffd „Zdd
e
d e
deeee
ffd
„Zgd¢Zgd¢Zd
2026-04-10 16:52:07 +08:00
e
deeee
ffd„Zd
e
deee
ffd„Zd
e
dee
fd„Zdd
e
d e
deeee
ffd„Zdd
e
d e
dee
fd„Z dd
e
d e
2026-04-14 10:28:22 +08:00
dee
fd„Z dd
e
d e
dedefd„Zy)u
SQL 验�工具集
éN)ÚTupleÚListÚDictÚOptionalzC[\u3000-\u303f\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]ÚtextÚreturncó>—ttj|««S©N)ÚboolÚ_CJK_IN_STRING_REÚsearch)rs ú@C:\Users\24019\Desktop\backman-camel\backend\utils\validators.pyÚ_cjk_text_in_string_literalrs€Ü Ô!×(Ñ(¨Ó.Ó /Ð/ócó@—|€y|j«D]}||usŒyy)NFT)Úwalk)ÚrootÚtargetÚns rÚ_node_in_subtreers)€Ø €|ØØ
�Y‰YŽ[ˆØ �Š;Ùðð rcó¤—|j|j«ry|j|j«ry|j|j«}|�*|jj d«}|�
t
2026-04-10 16:52:07 +08:00
||«ry|j|j«}|�´|jj d«}|�
t
||«ry|jj d«xsgD]J}|jj d«}|j}|�t
||«ry|€Œ=t
2026-04-14 10:28:22 +08:00
||«sŒJy|j|j«}|�Œ´y)u
2026-04-10 16:52:07 +08:00
�止� CJK 的字��出现在「比对/过滤�语境:WHERE�HAVING�JOIN ON�
以� CASE 分支的 WHEN �件(�简� CASE 的 WHEN 值),
但�许出现在 SELECT 投影�CASE 的 THEN/ELSE 结果等纯展示�置。
TÚonÚdefaultFÚifsÚtrue) Ú
find_ancestorÚWhereÚHavingÚJoinÚargsÚgetrÚCaseÚthis) ÚnodeÚexpÚjoinrÚcaserÚbrÚ then_exprÚconds rÚ _cjk_string_in_forbidden_contextr+s.€ð  ×ј#Ÿ)™)Ô$ØØ ×ј#Ÿ*™*Ô%ØØ × Ñ ˜cŸh™hÓ '€DØ ÐØ
�Y‰Y�]‰]˜4Ó
ˆØ
ˆ>Ô.¨r°4Ô8Øà × Ñ ˜cŸh™hÓ '€DØ
2026-04-10 16:52:07 +08:00
Ð
Ø—)‘)—-‘-  Ó*ˆØ Ð Ô#3°G¸TÔ#BØØ—)‘)—-‘- Ó&Ò,¨"Ò,ˆBØŸ™Ÿ ™  FÓ+ˆIØ—7‘7ˆDØÐ$Ô)9¸)ÀTÔ)JÙØÑÔ$4°T¸4Õ$@Ùð
-ð×!Ñ! #§(¡(Ó+ˆð Ñ
ð rÚsqlcóÀ‡‡ —g}d}t‰«Š d}d}dtdtttffˆ ˆfd„ }|‰ k�r|r‰|dk(rd}|dz
}Œ|r!|dz‰ kr‰||dzd k(rd}|dz
}n|dz
2026-04-10 16:52:07 +08:00
}Œ;‰||dz}|d
k(rd }|dz
}ŒP|d k(rd }|dz
}Œ]|dz‰ krY‰|d
vrR‰|dzdk(rG||dz«\}}t |«r-|ddt|«dkDrdndz}|j d|›d�«Œ¾‰|dk(rH||dz«\}}t |«r-|ddt|«dkDrdndz}|j d|›d�«�Œ|dz
}|‰ kr�Œt|«dk(|fS)uµ
解�失败时的回退:扫��引�字符串(� N'…'),字��内出现 CJK �失败。
跳过 ``--`` 行注释与 ``/* */`` �注释内的文本。
rFÚstartrcó•—|}g}|‰krf‰|}|dk(r@|dz‰kr"‰|dzdk(r|jd«|dz
2026-04-10 16:52:07 +08:00
}Œ9dj|«|dzfS|j|«|dz
}|‰krŒfdj|«|fS)NÚ'ééÚ)Úappendr&)r.ÚjÚpartsÚchrr,s €€rÚ_read_single_quoted_stringzB_check_no_cjk_legacy_text_scan.<locals>._read_single_quoted_stringJs ø€Ø ˆØˆØ�!ŠeØ�Q‘ˆBØ�SŠyØ�q‘5˜1’9  Q¨¡U¡¨sÒ!2Ø—L‘L Ô%ؘ‘F�AØØ—w‘w˜u“~ q¨1¡uÐ,Ð,Ø �L‰L˜Ô Ø
�‰FˆAð�!‹eð�w‰w�u‹~˜qÐ Ð rÚ
r1r2z*/z--Tz/*ÚNnr0Né0õ…r3ujSQL 字符串字é�¢é‡�中å�«ä¸­æ–‡æˆ–与业务中文直接作为比对值(ç¦�止)。片段近似: …'õ]'… — 请改用 Schema 注释中的代ç �/枚举,或通过维表 JOIN 用键列过滤。)ÚlenÚintrÚstrrr4)
r,ÚerrorsÚiÚin_line_commentÚin_block_commentr8ÚtwoÚbodyÚprevrs
` @rÚ_check_no_cjk_legacy_text_scanrH?sóù€ð
€FØ €AÜ ˆC‹€AØ€OØÐð
!¬#ð
!´%¼¼S¸±/ö
!ð ˆa‹%Ù Ø�1‰v˜Š~Ø"'�Ø
�‰FˆAØ Ù Ø�1‰u�qŠy˜S  Q¨¡U˜^¨tÒ3Ø#(Ð Ø�Q‘‘à�Q‘�Ø à�!�a˜!‘eˆnˆØ �$Š;Ø"ˆOØ
�‰FˆAØ Ø �$Š;Ø#Ð Ø
�‰FˆAØ à ˆq‰5�1Š9˜˜Q™ 4™¨C°°A±©J¸#Ò,=Ù0°°Q±Ó7‰GˆD�!Ü*¨4Ô0ؘC˜R�y¬S°«Y¸ª^¡EÀÑD�Ø—
‘
ð)Ø)-¨ð/LðMôð
à ˆq‰6�SŠ=Ù0°°Q±Ó7‰GˆD�!Ü*¨4Ô0ؘC˜R�y¬S°«Y¸ª^¡EÀÑD�Ø—
‘
ð)Ø)-¨ð/LðMôñ
à ˆQ‰ˆðY ˆaŒ%ô\ ˆv‹;˜!Ñ ˜VÐ #Ð#rÚdialectcó>—ddlm}m}g} |||¬«}|j«D]¯}d}t||j«r"|jrt|j«}n+t||j«rt|j«}|� t|«sŒvt||«sŒƒ|ddt!|«dkDrdndz} |j#d | ›d
�«Œ±t!|«dk(|fS#t$r+}tj d|«t
|«cYd}~Sd}~wwxYw) u&
�止在「过滤/比对�语境使用�中日韩字符的字符串字��(� T-SQL ``N'…'``)。
�许在 SELECT 投影�CASE 的 THEN/ELSE 结果等展示用字��中使用中文标签。
解�失败时回退为全文扫�(与旧版一致,�严)。
r©Ú parse_oner%©rIu9CJK 校验回退为全文扫æ��(SQL è§£æž�失败): %sNr;r<r3uySQL 在 WHERE/HAVING/JOIN ON 或 CASE/WHEN æ�¡ä»¶ä¸­å‡ºçްå�«ä¸­æ–‡çš„字符串字é�¢é‡�(ç¦�止)。片段近似: …'r=)ÚsqlglotrLr%Ú ExceptionÚloggerÚdebugrHrÚ
isinstanceÚLiteralÚ is_stringr@r#ÚNationalrr+r>r4)
r,rIrLr%rAÚparsedÚer$rrGs
2026-04-10 16:52:07 +08:00
rÚ#check_no_cjk_in_sql_string_literalsrXŠs €÷'à€Fð3Ù˜3¨Ô0ˆð
— ‘ –
ˆØ"ˆÜ �d˜CŸK™KÔ (¨T¯^ª^Ü�t—y‘y“>‰DÜ
˜˜cŸl™lÔ
+Ü�t—y‘y“>ˆDØ ˆ<Ô:¸4Ô@Ø Ü +¨D°#Õ 6ؘ˜�9¬¨T«°Rª¡¸RÑ@ˆDØ �M‰Mð%Ø%) Fð+HðIõ
ðô ˆv‹;˜!Ñ ˜VÐ #Ð#øô' ò3Ü� ‰ ÐPÐRSÔTÜ-¨cÓ2Õ2ûð3úsŒ
C(Ã( DÃ1 DÄDÄD)ÚDROPÚDELETEÚUPDATEÚINSERTÚALTERÚTRUNCATEÚCREATEz
DROP DATABASEz
DROP TABLEz
DROP INDEXÚGRANTÚREVOKEÚPURGEÚFLUSHÚKILL)5ÚSELECTÚWITHÚFROMÚWHEREÚJOINz LEFT JOINz
RIGHT JOINz
INNER JOINz
OUTER JOINÚONÚUSINGzGROUP BYÚHAVINGzORDER BYÚLIMITÚOFFSETÚUNIONz UNION ALLÚEXCEPTÚ INTERSECTÚASÚCASEÚWHENÚTHENÚELSEÚENDÚCOUNTÚSUMÚAVGÚMINÚMAXÚDISTINCTÚANDÚORÚNOTÚINÚEXISTSÚBETWEENÚLIKEzIS NULLz IS NOT NULLÚCASTÚCOALESCEÚNULLIFÚIFNULLÚDATEÚTIMEÚ TIMESTAMPÚEXTRACTÚ DATE_FORMATÚ STR_TO_DATEÚ CURRENT_DATEÚCURRENT_TIMESTAMPcó—|j«}g}tD]E}dtj|«zdz}tj||«sŒ5|j |«ŒGt
|«dk(}|stjd|›�«||fS)u¡
检查SQL是�包��险�作
Args:
sql: SQL语�(大�写��感)
2026-04-10 16:52:07 +08:00
Returns:
(是�安全, �险关键�列表)
z\bru检测到å�±é™©æ“�作: ) ÚupperÚDANGEROUS_KEYWORDSÚreÚescaper
r4r>rPÚwarning)r,Ú sql_upperÚ
found_dangersÚkeywordÚpatternÚis_safes rÚcheck_dangerous_operationsrœÂs…€ð— ‘ “ €IØ€Mç%ˆàœ"Ÿ)™) GÓ,Ñ,¨uÑ4ˆÜ
�9‰9�W˜iÕ (Ø × Ñ  Õ )ð &ô �-Ó  AÑ%€Gá Ü�‰Ð0°°Ð@ÔAà �MÐ !Ð!rcóì—|j«j«}|j«r|j«dnd}|dvrdd|›�fSt|«\}}|sdddj |«›�fSy) uw
验�SQL�是DML/DDL�作(仅�许SELECT等查询)
Returns:
(是�通过, 错误消�)
rr3)r\r[rZrYr]r_r^Fuç¦�止的æ“�作: uSQL包å�«å�±é™©æ“�作: ú, )Tr3)Ústripr’Úsplitrœr&)r,r—Ú
first_wordr›Údangerss rÚvalidate_no_dmlr£Ýs„€ð— ‘ “ ×!Ñ!Ó#€Ið*3¯©Ô):�—‘Ó" 1Ò%À€JØÐZÑZØÐ)¨*¨Ð6Ð6Ð6ä1°#Ó6Ñ€GˆWÙ ØÐ/°· ± ¸'Ó0BÐ/CÐDÐDÐDà rcóÚ—dddddddœ}g}|j«}|j«D]<\}}tj||tj«sŒ,|j |«Œ>|S)u|
检查明显的SQL注入模�
2026-04-10 16:52:07 +08:00
Args:
sql: SQL语�
Returns:
�现的注入模�列表
zUNION\s+ALL\s+SELECTzUNION\s+SELECTz(--|\#|/\*).*SELECTz;\s*(DROP|DELETE|UPDATE|INSERT)z OR\s+['\"]?\s*1\s*['\"]?\s*=\s*1z 1\s*=\s*1)Úunion_all_injectionÚunion_injectionÚcomment_injectionÚsemicolon_injectionÚor_true_conditionÚ always_true)ÚlowerÚitemsr”r
Ú
IGNORECASEr4)r,ÚpatternsÚfindingsÚ sql_lowerÚnameršs rÚcheck_sql_injection_patternsr²òsk€ð 7Ø,Ø3ØAØ@Ø#ñ
€Hð€HØ— ‘ “ €Ià!Ÿ™Ö)‰
ˆˆgÜ
�9‰9�W˜c¤2§=¡=Õ 1Ø �O‰O˜DÕ !ð*ð €Orcó°‡—ddlm}mŠg} |||¬«}t|‰j«sdgfS|j
}|j jd«}|s7tˆfd„|D««}|r|jd«t|«dk(|fS|j
}t«} |D]‰}
t|
‰j«r| j|
j«Œ5t|
‰j«sŒL|
j } t| ‰j«sŒo| j| j«Œ‹|D]ß}
2026-04-10 16:52:07 +08:00
|
j#‰j$«rŒt|
‰j&«rŒ6t|
‰j«r'|