/
githubmirror
/
gogs
Обзор
Документация
Войти
/
githubmirror
/
gogs
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
internal/markup/sanitizer.go
67 строк
2 KB
ᴊᴏᴇ ᴄʜᴇɴ
security: restrict ipynb sanitizer to safe image data URIs (#8326)
06 июн 2026, 06:15
Не верифицирован
06 июн 2026, 06:15
dd1bd98
Код
Авторство
О чём код?
package markup import ( "net/url" "strings" "sync" "github.com/microcosm-cc/bluemonday" "gogs.io/gogs/internal/conf" "gogs.io/gogs/internal/lazyregexp" ) // Sanitizer is a protection wrapper of *bluemonday.Policy which does not allow // any modification to the underlying policies once it's been created. type Sanitizer struct { policy *bluemonday.Policy init sync.Once } var sanitizer = &Sanitizer{ policy: bluemonday.UGCPolicy(), } // NewSanitizer initializes sanitizer with allowed attributes based on settings. // Multiple calls to this function will only create one instance of Sanitizer during // entire application lifecycle. func NewSanitizer() { sanitizer.init.Do(func() { // We only want to allow HighlightJS specific classes for code blocks sanitizer.policy.AllowAttrs("class").Matching(lazyregexp.New(`^language-\w+$`).Regexp()).OnElements("code") // Checkboxes sanitizer.policy.AllowAttrs("type").Matching(lazyregexp.New(`^checkbox$`).Regexp()).OnElements("input") sanitizer.policy.AllowAttrs("checked", "disabled").OnElements("input") // Only allow data URIs with safe image MIME types to prevent XSS via // "data:text/html" payloads. sanitizer.policy.AllowURLSchemeWithCustomPolicy("data", IsSafeDataURI) // Custom URL-Schemes sanitizer.policy.AllowURLSchemes(conf.Markdown.CustomURLSchemes...) }) } // IsSafeDataURI returns whether the given data URI uses a safe image MIME type. func IsSafeDataURI(u *url.URL) bool { // The opaque data of a data URI has the form "mediatype;base64,data" or // "mediatype,data". We only allow common image MIME types. mediatype, _, _ := strings.Cut(u.Opaque, ";") mediatype, _, _ = strings.Cut(mediatype, ",") switch strings.TrimSpace(strings.ToLower(mediatype)) { case "image/png", "image/jpeg", "image/gif", "image/webp", "image/x-icon": return true } return false } // Sanitize takes a string that contains a HTML fragment or document and applies policy whitelist. func Sanitize(s string) string { return sanitizer.policy.Sanitize(s) } // SanitizeBytes takes a []byte slice that contains a HTML fragment or document and applies policy whitelist. func SanitizeBytes(b []byte) []byte { return sanitizer.policy.SanitizeBytes(b) }