Files
ALPHA-TRAIN2/services/tiktak/main.go
T
bobiqqandClaude Opus 5 fac56abb1d tiktak: LFI/auth-bypass в /vtt/, утечка превью, креды
- handleVtt: id валидируется как положительное целое, ошибка GetVideo
  больше не игнорируется. Закрывает сразу два вектора: обход ACL через
  нулевой db.Video (Private=false => haveAccess пропускал анонима) и
  path traversal в path.Join(VttFolder, vid+".vtt").
- handleCreate: резкое превью приватного видео удаляется после блюра,
  иначе оно оставалось доступным в public/static через echo.Static.
- main.go: DSN приведён к паролю из compose (5935004 поменял только
  compose, из-за чего сервис не достучался бы до базы).
- db: пароли хешируются sha256 с pepper, сверка в Go constant-time,
  плейнтекст принимается как legacy => старые юзеры не теряют доступ.
- cookies: HttpOnly + Path=/ + SameSite=Lax.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 11:42:05 +03:00

57 lines
1.2 KiB
Go

package main
import (
"context"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/gocraft/dbr/v2"
"github.com/thanhpk/randstr"
"net/http"
"os"
"os/signal"
"tiktak/db"
"tiktak/server"
"tiktak/server/auth"
"tiktak/video"
"time"
)
func main() {
// Rotated DB password. Must stay in sync with MYSQL_ROOT_PASSWORD in
// docker-compose.yml AND with the actual MySQL user (ALTER USER) when the
// ./db_data volume already exists.
conn, err := dbr.Open(
"mysql",
"root:cRazy_P4ssw0rd_MeOw_Me0W_676767676767@tcp(db:3306)/tiktak", nil)
if err != nil {
panic(err)
}
defer conn.Close()
auth.SetSalt(randstr.Hex(20))
config := server.Config{
StaticFolder: "public/static",
VttFolder: "public/vtt",
TemplatesFolder: "templates",
}
srv := server.NewServer(db.New(conn), &video.Storage{Directory: "public/video"}, config)
// Start server
go func() {
if err := http.ListenAndServe(":4000", srv); err != nil {
fmt.Println("shutting down the server")
}
}()
// Graceful shutdown
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
panic(err)
}
}