You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Guard-ът на run_sql пази срещу memory-amplification (цял table scan, колабиран в една огромна клетка, която се материализира преди capRows) чрез денилист на опасни скаларни/агрегатни функции в apps/web/app/lib/assistant/sql-guard.ts. По време на ревюто на #223 денилистът беше разширяван на няколко пъти (group_concat → json_group_array/json_group_object → string_agg).
Денилистът по природа е catch-up игра: всеки нов алиас/функция от нова версия на SQLite трябва да се добавя ръчно (string_agg е синонимът на group_concat от SQLite 3.44; D1 върви на съвременна SQLite). Прихванахме го при ревю, но следващият алиас може да се промъкне.
Предложение (2 допълващи се посоки)
Позитивен allowlist на функциите (durable fix). Вместо денилист — allowlist на позволените скаларни/агрегатни/date функции за read-only аналитика; всичко извън него fail-closed. Така нов алиас пада по подразбиране, без да го гоним поотделно. Бел.: на feat/ai-assistant (feat(ai-assistant): conversational analytic layer (BgGPT) #79) слой L2 (sql-ast-guard) вече има такъв позитивен allowlist — струва си да се пренесе към guard-а на main, или L1 да делегира на него.
Твърд таван върху размера на клетката преди capRows.capRows пази първия ред цял; един голям низ в една клетка минава. Таван върху байтовете на отделна клетка (преди/по време на четенето) затваря и остатъка, който денилистът не може — напр. краен, но огромен || chain (SELECT a||a||…||a), който не ползва нито една блокирана функция.
Контекст
Guard-ът на
run_sqlпази срещу memory-amplification (цял table scan, колабиран в една огромна клетка, която се материализира предиcapRows) чрез денилист на опасни скаларни/агрегатни функции вapps/web/app/lib/assistant/sql-guard.ts. По време на ревюто на #223 денилистът беше разширяван на няколко пъти (group_concat→json_group_array/json_group_object→string_agg).Денилистът по природа е catch-up игра: всеки нов алиас/функция от нова версия на SQLite трябва да се добавя ръчно (
string_aggе синонимът наgroup_concatот SQLite 3.44; D1 върви на съвременна SQLite). Прихванахме го при ревю, но следващият алиас може да се промъкне.Предложение (2 допълващи се посоки)
Позитивен allowlist на функциите (durable fix). Вместо денилист — allowlist на позволените скаларни/агрегатни/date функции за read-only аналитика; всичко извън него fail-closed. Така нов алиас пада по подразбиране, без да го гоним поотделно. Бел.: на
feat/ai-assistant(feat(ai-assistant): conversational analytic layer (BgGPT) #79) слой L2 (sql-ast-guard) вече има такъв позитивен allowlist — струва си да се пренесе към guard-а наmain, или L1 да делегира на него.Твърд таван върху размера на клетката преди
capRows.capRowsпази първия ред цял; един голям низ в една клетка минава. Таван върху байтовете на отделна клетка (преди/по време на четенето) затваря и остатъка, който денилистът не може — напр. краен, но огромен||chain (SELECT a||a||…||a), който не ползва нито една блокирана функция.Референции
sql-guard.ts(string_agg), рекурсивни CTE (вече блокирани на L2).