Прототип защиты от XSS в nanoislands.
Проблема состоит в том, что часто надо прокидывать html-разметку в вызовы nb-*
. Но это черевато XSS.
Чтобы упростить API, в nanoislands
делается вот так:
match / {
islandHTMLContent = apply / island-content
nb-island({
content: islandHTMLContent
})
}
func nb-island (obj) {
// ...
// вставляем .content как есть без эскейпинга
html(.content)
// ...
}
Всё - теоретический XSS!
Есть два типа разрешенных вызова:
content
имеет тип xml, т.е. прошел черезyate
и безопасен для вставки. Сюда попадают и вызовы функций, возвращающие xml.content
имеет типscalar
, вычисляем (т.е. статичен) и не имеет<>
nb-island({
content: 'OK'
})
nb-island({
content: 'OK <'
})
nb-island({
content: '<FAIL>'
})
Проверяются все свойства *content*
(в т.ч. buttonContent
, leftContent
и т.п.) в вызовах nb-функций.
Игнорируется свойство content
для nb-input
и nb-textarea
, потому что оно используются безопасно.
$ node ./bin/nb-check-call my-templates.yate