Oto jak to zrobiłem, bo ekspresowe ludzie. Wydaje się, że działało bardzo dobrze w połączeniu z ekspresowym odkażaniem.
app.js
import expressSanitizer from 'express-sanitizer'
app.use(expressSanitizer())
app.post('/route', async (req, res) => {
const title = req.body.article.title
const content = req.sanitize(req.body.article.content)
// Do stuff with content
})
nowy.EJS
<head>
<link href="https://cdn.quilljs.com/1.3.2/quill.snow.css" rel="stylesheet">
</head>
...
<form action="/route" method="POST">
<input type="text" name="article[title]" placeholder="Enter Title">
<div id="editor"></div>
<input type="submit" onclick="return quillContents()" />
</form>
...
<script src="https://cdn.quilljs.com/1.3.2/quill.js"></script>
<script>
const quill = new Quill('#editor', {
theme: 'snow'
})
const quillContents =() => {
const form = document.forms[0]
const editor = document.createElement('input')
editor.type = 'hidden'
editor.name = 'article[content]'
editor.value = document.querySelector('.ql-editor').innerHTML
form.appendChild(editor)
return form.submit()
}
</script>
express-sanitizer
(https://www.npmjs.com/package/express-sanitizer)
document.forms
(https://developer.mozilla.org/en-US/docs/Web/API/Document/forms)
Moim zdaniem ma tylko jedną formę, więc użyłem document.forms[0]
, ale jeśli masz kilka lub może przedłużyć swój pogląd w przyszłości mieć wiele formularzy, sprawdź referencję MDN.
To, co tu robimy, polega na tworzeniu ukrytych danych wejściowych do formularza, które przypisujemy zawartości Div Quill, a następnie bootleg formularz przesłać i przekazać go za pośrednictwem naszej funkcji, aby zakończyć.
Teraz, aby go przetestować, zrób post z <script>alert()</script>
w nim, a nie będziesz musiał się martwić o exploity wtryskowe.
To wszystko.
Wydaje się, że działa całkiem dobrze: https://github.com/nozer/quill-delta-to-html –