package lkgateway // sqlident.go — имена объектов MSSQL из настроек (процедура обработчика DEPO, // база, логин) параметризовать нельзя, они склеиваются в текст запроса. Чтобы // значение из формы не превратилось в произвольный T-SQL, перед EXEC имя // проверяется по строгому шаблону идентификатора. import ( "context" "database/sql" "fmt" "regexp" ) // sqlIdentRe — допустимое имя: буквы, цифры, подчёркивание, точка (схема.имя), // квадратные скобки MSSQL. Ни пробелов, ни кавычек, ни точки с запятой. var sqlIdentRe = regexp.MustCompile(`^[A-Za-z0-9_.\[\]]{1,128}$`) // sqlIdentOK — строка похожа на имя объекта SQL, а не на код. func sqlIdentOK(s string) bool { return sqlIdentRe.MatchString(s) } // execProc — выполнить хранимую процедуру по имени из настроек, предварительно // проверив имя. Сигнатура как у ExecContext, чтобы подставлять на место "exec "+name. func execProc(ctx context.Context, db *sql.DB, proc string) (sql.Result, error) { if !sqlIdentOK(proc) { return nil, fmt.Errorf("недопустимое имя процедуры %q: разрешены буквы, цифры, _ . [ ]", proc) } return db.ExecContext(ctx, "exec "+proc) }