Практика безопасность#

Зашита от HTML инъекций#

При постройке HTML строки нужно экранировать все значения которые могли быть введены пользователем

Для экранирования значений можно использовать

  1. ru.bitec.app.btk.utils.HTMLUtils.escape для вставки срок

  2. Использовать 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>Ваня&lt;/h1&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;&lt;h1&gt;</h1>
*/
val sHTML_correct = s"""
  <h1>${HTMLUtils.escape(sName)}</h1>
  """

/* scala XML сама экранирует значения. Выведется как обычный текст
<h1>Ваня&lt;/h1&gt;&lt;script&gt;alert('XSS')&lt;/script&gt;&lt;h1&gt;</h1>
*/
val HTML = <h1>{sName}</h1>.toString

Если нужно использовать пользовательский HTML. То его нужно отчистить от вредоносного кода

  1. 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&amp;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))
}