İçeriğe atla
ÖzelliklerFiyatlandırmaİş OrtaklığıBlogYardımHakkımızdaİletişim
BaşlaGiriş Yap
Bloga Dön
industry2026-05-2312 dk okuma

Store manager multi-location panelini açtığında "hi" popup'ı çıktı — brand logo_url alanında safeHref() eksikti (stored XSS via zod .url() bypass)

Eskişehir Tepebaşı'nda 38 yaşında "Smyrna Burger" 4-şubeli burger zinciri sahibi Burak, yeni "Smyrna Wings" sub-brand'i için form'da "Logo URL" alanına Stack Overflow'dan kopyaladığı bir CSP makalesi snippet'ini — `javascript:alert('hi')` — yanlışlıkla yapıştırdı, save'di, yattı. Sabah store manager Pelin multi-location panelini açtı, "hi" popup'ı gördü. thMenu support 3 katmanlı forensik: (1) zod `.url()` `javascript:` scheme'ini neden kabul ediyor? Cevap: zod Node'un `new URL()` constructor'ını çağırıyor, RFC 3986'a göre `javascript:foo` valid URL. (2) React `<img src>` safe ama `<a href>` değil — anchor tag'i Pelin'in click veya hover-prefetch davranışıyla execute olabiliyordu. (3) thMenu codebase'inde zaten PR #334'te shipped olan `safeHref()` helper var — restaurants.{wifi_url, logo_url, cover_url} + social_links.url'a uygulanmış, ama yeni shipped olan `brands.logo_url` (PR #515 multi-location) helper-vs-new-feature drift ile atlanmıştı. **PR #661 batch XI F3** fix: brands POST + PATCH handler'larında `safeHref(url, { maxLen: 500 })` wrap eklendi; invalid scheme → 422 `invalid_logo_url`; PATCH null vs undefined ayrımı korundu. Bu vector kötü niyetli operator senaryosunda store-manager session hijack → affiliate commission theft → super-admin compromise privilege escalation chain'i açıyordu. Pattern: yeni URL-saklayan kolon shipped olduğunda safeHref() (veya equivalent scheme allowlist helper) POST + PATCH'in her ikisinde de aynı PR'da uygulanmalı; render layer escape'e güvenilmemeli — storage-side reddetmek tek doğru yer.

th

thMenu Ekibi

thmenu.com

Faydalı buldunuz mu? Paylaşın.