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

125 lines
14 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
2026-04-14 10:28:22 +08:00
4yÜiï2ã
ór—dZddlZddlZddlmZmZmZeje«Z ejd«Z de dee
ee ffd„Zgd¢Zgd ¢Zde dee
2026-04-10 16:52:07 +08:00
ee ffd
2026-04-14 10:28:22 +08:00
„Zde dee
e ffd „Zde dee fd „Zdde d
e dee
ee ffd„Zdde d
e dee fd„Z dde d
e dee fd„Z dde d
e de
defd„Zy)u
SQL 验�工具集
2026-04-10 16:52:07 +08:00
éN)ÚTupleÚListÚDictzC[\u3000-\u303f\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]ÚsqlÚreturncó臇 —g}d}t‰«Š d}d}dtdtttffˆ ˆfd„ }|‰ k�r(|r‰|dk(rd}|dz
}Œ|r!|dz‰ kr‰||dzd k(rd}|dz
}n|dz
}Œ;‰||dz}|d
2026-04-14 10:28:22 +08:00
k(rd }|dz
2026-04-10 16:52:07 +08:00
}ŒP|d k(rd }|dz
}Œ]|dz‰ krc‰|d
vr\‰|dzdk(rQ||dz«\}}tj |«r-|ddt|«dkDrdndz}|j
d|›d�«ŒÈ‰|dk(rR||dz«\}}tj |«r-|ddt|«dkDrdndz}|j
d|›d�«�Œ"|dz
}|‰ kr�Œ(t|«dk(|fS)u¾
扫� SQL 中�引�字符串(� T-SQL N'…'),若字��内出现 CJK 则判失败。
2026-04-14 10:28:22 +08:00
2026-04-10 16:52:07 +08:00
跳过 ``--`` 行注释与 ``/* */`` �注释内的文本,��误报。
rFÚstartrcó•—|}g}|‰krf‰|}|dk(r@|dz‰kr"‰|dzdk(r|jd«|dz
}Œ9dj|«|dzfS|j|«|dz
}|‰krŒfdj|«|fS)u[从 start 指å�‘çš„ opening `'` 之å�Žå¼€å§‹è¯»ï¼Œè¿”回 (内容, é—­å�ˆå¼•å�·å�Žä¸‹æ ‡)。Ú'ééÚ)ÚappendÚjoin)r ÚjÚpartsÚchÚnrs €€úbackend\utils\validators.pyÚ_read_single_quoted_stringzGcheck_no_cjk_in_sql_string_literals.<locals>._read_single_quoted_strings ø€à ˆØˆØ�!Š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˜Ô Ø
2026-04-14 10:28:22 +08:00
�‰FˆAð�!‹eð�w‰w�u‹~˜qÐ Ð óÚ
r r
2026-04-10 16:52:07 +08:00
z*/z--Tz/*ÚNnr Né0u…rujSQL 字符串字é�¢é‡�中å�«ä¸­æ–‡æˆ–与业务中文直接作为比对值(ç¦�止)。片段近似: …'u]'… — 请改用 Schema 注释中的代ç �/枚举,或通过维表 JOIN 用键列过滤。)ÚlenÚintrÚstrÚ_CJK_IN_STRING_REÚsearchr)
rÚerrorsÚiÚin_line_commentÚin_block_commentrÚtwoÚbodyÚprevrs
` @rÚ#check_no_cjk_in_sql_string_literalsr'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�!Ü ×'Ñ'¨Ô-ؘC˜R�y¬S°«Y¸ª^¡EÀÑD�Ø—
2026-04-14 10:28:22 +08:00
‘
ð)Ø)-¨ð/LðMôð
2026-04-10 16:52:07 +08:00
à ˆq‰6�SŠ=Ù0°°Q±Ó7‰GˆD�!Ü ×'Ñ'¨Ô-ؘC˜R�y¬S°«Y¸ª^¡EÀÑD�Ø—
‘
ð)Ø)-¨ð/LðMôñ
à ˆQ‰ˆð[ ˆaŒ%ô^ ˆv‹;˜!Ñ ˜VÐ #Ð#r)Ú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语�(大�写��感)
Returns:
(是�安全, �险关键�列表)
z\bru检测到å�±é™©æ“�作: ) ÚupperÚDANGEROUS_KEYWORDSÚreÚescaperrrÚloggerÚwarning)rÚ sql_upperÚ
found_dangersÚkeywordÚpatternÚis_safes rÚcheck_dangerous_operationsrlts…€ð— ‘ “ €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:
(是�通过, 错误消�)
rr)r+r*r)r(r,r.r-Fuç¦�止的æ“�作: uSQL包å�«å�±é™©æ“�作: ú, )Tr)ÚstripraÚsplitrlr)rrgÚ
2026-04-14 10:28:22 +08:00
first_wordrkÚdangerss rÚvalidate_no_dmlrs�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ÚitemsrcrÚ
IGNORECASEr)rÚpatternsÚfindingsÚ sql_lowerÚnamerjs rÚcheck_sql_injection_patternsr‚¤sk€ð 7Ø,Ø3ØAØ@Ø#ñ
€Hð€HØ— ‘ “ €Ià!Ÿ™Ö)‰
ˆˆgÜ
�9‰9�W˜c¤2§=¡=Õ 1Ø �O‰O˜DÕ !ð*ð €OrÚdialectcó°‡—ddlm}mŠg} |||¬«}t|‰j«sdgfS|j
}|j jd«}|s7tˆfd„|D««}|r|jd«t|«dk(|fS|j
}t«} |D]‰}
t|
‰j«r| j|
2026-04-14 10:28:22 +08:00
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'|
j} | | vsŒ]|jd| ›d �«Œst|
‰j(«sŒŠ|
j } t| ‰j«sŒ­| j} | | vsŒ¾|jd| ›d
|
j*›d �«Œá t|«dk(|fS#t,$r"}
t.j1d |
›�«Yd
}
~
Œ6d
2026-04-14 10:28:22 +08:00
}
2026-04-10 16:52:07 +08:00
~
wwxYw)uá
验���查询的GROUP BY正确性
检查:SELECT中的���字段是�都在GROUP BY中
Args:
sql: SQL语�
dialect: SQL方言
Returns:
(是�有效, 错误列表)
r©Ú parse_oneÚexp©rƒTÚgroupc3óX•K—|]!}|j‰j«du–—Œ#y­w)N)ÚfindÚAggFunc)Ú.0Úexprr‡s €rÚ <genexpr>z/validate_aggregation_groupby.<locals>.<genexpr>às+øèø€ðá(�Dð— ‘ ˜#Ÿ+™+Ó&¨dÔ2Ù(ùsƒ'*u)包å�«è�šå�ˆå‡½æ•°ä½†ç¼ºå°‘GROUP BYå­�å�¥u字段 'u"' 在SELECT中但ä¸�在GROUP BY中u
2026-04-14 10:28:22 +08:00
' (别å��为'u#') 在SELECT中但ä¸�在GROUP BY中uGROUP BY验è¯�异常: N)Úutils.sql_parserr†r‡Ú
isinstanceÚSelectÚ expressionsÚargsÚgetÚanyrrÚsetÚColumnÚaddr�ÚOrderedÚthisr‹rŒÚLiteralÚAliasÚaliasÚ ExceptionreÚdebug)rrƒr†r ÚparsedÚ select_exprsÚgroup_byÚhas_aggÚgroup_by_exprsÚ
group_by_colsrŽr›Úcol_nameÚer‡s @rÚvalidate_aggregation_groupbyr©Ásø€÷0à
€Fð?3Ù˜3¨Ô0ˆô˜& #§*¡*Ô-ؘ�8ˆOð×)Ñ)ˆ ð—;‘;—?‘? 7Ó+ˆÙäóá(óóˆGñØ—
‘
2026-04-10 16:52:07 +08:00
ÐIÔJÜ�v“; !Ñ# VÐ+Ð +à!×-Ñ-ˆô›ˆ
Û"ˆDܘ$ §
¡
2026-04-14 10:28:22 +08:00
Ô+Ø×!Ñ! $§)¡)Õ,ܘD #§+¡+Õ.à—y‘y�ܘd C§J¡JÕ/Ø!×%Ñ% d§i¡iÕ0ð#ó!ˆDà�y‰y˜Ÿ™Ô%Øô˜$ § ¡ Ô,Øô˜$ §