Контекст
D1 няма native runtime read-only binding - env.DB дава пълен read+write и това не се скоупва на ниво binding (CF токените са само за deploy/migrations, не за runtime). Затова least-privilege за четене се постига на app-layer.
Тук се получава чисто, защото web worker-ът никога легитимно не пише в D1: всички записи идват от sigma-etl (отделен worker с отделен binding); кешът е през Cache API, лимитерите - през ratelimit binding, report snapshot-ите - в R2. Единственият модел-контролиран SQL е assistant run_sql, който е замислен само за четене.
Предложение
Тънък read-only wrapper над env.DB, изложен от @sigma/db и ползван навсякъде в web. Отхвърля всичко освен четене (INSERT / UPDATE / DELETE / REPLACE, DDL, PRAGMA, ATTACH и т.н.), така че write просто не е достъпен от web runtime. Един chokepoint в @sigma/db.
Ползи
- Least-privilege / defense-in-depth за целия web D1 достъп.
- Обезврежда read-only D1 gate-а: щом web няма write-capable binding, assistant
run_sql няма как да стигне до write път - AST guard-ът в sql-guard.ts спира да е единствената носеща защита.
Обхват и бележки
- Това е app-layer мярка. Не е и не заменя:
- Миграциите се движат от deploy/ETL, не от web runtime - wrapper-ът да не ги закача.
- Всички пътища, които днес ползват
env.DB директно, да минат през wrapper-а.
Връзки
Контекст
D1 няма native runtime read-only binding -
env.DBдава пълен read+write и това не се скоупва на ниво binding (CF токените са само за deploy/migrations, не за runtime). Затова least-privilege за четене се постига на app-layer.Тук се получава чисто, защото web worker-ът никога легитимно не пише в D1: всички записи идват от
sigma-etl(отделен worker с отделен binding); кешът е през Cache API, лимитерите - през ratelimit binding, report snapshot-ите - в R2. Единственият модел-контролиран SQL е assistantrun_sql, който е замислен само за четене.Предложение
Тънък read-only wrapper над
env.DB, изложен от@sigma/dbи ползван навсякъде в web. Отхвърля всичко освен четене (INSERT / UPDATE / DELETE / REPLACE, DDL,PRAGMA,ATTACHи т.н.), така че write просто не е достъпен от web runtime. Един chokepoint в@sigma/db.Ползи
run_sqlняма как да стигне до write път - AST guard-ът вsql-guard.tsспира да е единствената носеща защита.Обхват и бележки
run_sql(отделен gate item в AI асистент (#80) — launch-gate чеклист преди provision/изложение #83).env.DBдиректно, да минат през wrapper-а.Връзки
run_sqlread-only binding). Препоръка: щом това влезе, assistant: run_sql must use a read-only D1 binding before the prod BgGPT key #134 да се затвори като покрито или да се стесни до „провери, чеrun_sqlминава през read-only wrapper-а" - да не се дублира работа.