Практика безопасность
Contents
Практика безопасность#
Зашита от HTML инъекций#
При постройке HTML строки нужно экранировать все значения которые могли быть введены пользователем
Для экранирования значений можно использовать
ru.bitec.app.btk.utils.HTMLUtils.escape
для вставки срокИспользовать
scala.XML
для постройки HTML
val sName = ropUser.get(_.sName) // интересное имя "Ваня</h1><script>alert('XSS')</script><h1>"
/* Произошла HTML инъекция
<h1>Ваня</h1><script>alert('XSS')</script><h1></h1>
*/
val sHTML = s"""
<h1>$sName</h1>
"""
/* Нужно экранировать значения вставляемые в HTML-строку. Выведется как обычный текст
<h1>Ваня</h1><script>alert('XSS')</script><h1></h1>
*/
val sHTML_correct = s"""
<h1>${HTMLUtils.escape(sName)}</h1>
"""
/* scala XML сама экранирует значения. Выведется как обычный текст
<h1>Ваня</h1><script>alert('XSS')</script><h1></h1>
*/
val HTML = <h1>{sName}</h1>.toString
Если нужно использовать пользовательский HTML. То его нужно отчистить от вредоносного кода
ru.bitec.app.btk.utils.HTMLUtils.sanitize
Убирает весть JS, небезопасные элементы, и ссылки не на https ресурсы
/* HTML введенный пользователем
<img src="https://hips.hearstapps.com/clv.h-cdn.co/assets/16/18/gettyimages-586890581.jpg?crop=0.668xw:1.00xh;0.219xw,0&resize=980:*">
<img src="x" onError=alert('XSS')/>
*/
val sHTML = ropDoc.get(_.sDescription)
/* Безопасный для использования HTML
<img src="https://hips.hearstapps.com/clv.h-cdn.co/assets/16/18/gettyimages-586890581.jpg?crop=0.668xw:1.00xh;0.219xw,0&resize=980:*">
<img src="x">
*/
val sHTML_correct = HTMLUtils.sanitize(sHTML)
// Предотвращение на вставке в бд
override def setsDescription(rop: ApiRop, value: NString): Unit = {
super.setsDescription(rop, HTMLUtils.sanitize(value))
}