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

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

Защита от 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))
}