Перейти к основному содержанию
`Ctrl`+`K`

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

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