diff --git a/api/v1/handlers_impl.go b/api/v1/handlers_impl.go
index 0def75e..d772f5f 100644
--- a/api/v1/handlers_impl.go
+++ b/api/v1/handlers_impl.go
@@ -14,6 +14,7 @@ import (
"github.com/gomarkdown/markdown/html"
"github.com/gomarkdown/markdown/parser"
"github.com/gorilla/mux"
+ "github.com/microcosm-cc/bluemonday"
"github.com/rs/zerolog/log"
"github.com/snehmatic/mindloop/internal/config"
"github.com/snehmatic/mindloop/internal/core/motivation"
@@ -21,6 +22,8 @@ import (
"github.com/snehmatic/mindloop/models"
)
+var markdownPolicy = bluemonday.UGCPolicy()
+
func mdToHTML(md []byte) []byte {
// create markdown parser with extensions
extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
@@ -32,7 +35,7 @@ func mdToHTML(md []byte) []byte {
opts := html.RendererOptions{Flags: htmlFlags}
renderer := html.NewRenderer(opts)
- return markdown.Render(doc, renderer)
+ return markdownPolicy.SanitizeBytes(markdown.Render(doc, renderer))
}
// --- Quote Handler ---
diff --git a/api/v1/handlers_md_test.go b/api/v1/handlers_md_test.go
new file mode 100644
index 0000000..519ddfe
--- /dev/null
+++ b/api/v1/handlers_md_test.go
@@ -0,0 +1,37 @@
+package v1
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestMdToHTMLSanitizesUnsafeHTML(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ input string
+ deny []string
+ }{
+ {name: "script", input: "", deny: []string{"