Сайт и персональные данные: политика, формы, cookie и сторонние скрипты

0
12
Обложка статьи: Сайт и персональные данные: политика, формы, cookie и сторонние скрипты

Сайт — самое заметное место, где организация собирает персональные данные: формы обратной связи, заказы, подписки, регистрация, счётчики и виджеты. Поэтому проверка начинается с него и проходит дистанционно, без запроса. Типичные находки: нет политики на странице с формой, согласие спрятано в оферте, на сайте работают сторонние скрипты, о которых забыли. Ниже перечень требований и порядок самопроверки со скриптом, который показывает внешние домены страницы.

Оговорка. Статья не юридическая консультация. Требования к политике сверены по тексту части 2 статьи 18.1 152-ФЗ, к согласию — по статье 9, в редакции с изменениями закона от 14.07.2022 № 266-ФЗ (база «Гарант»); закон меняется, проверяйте действующую редакцию: текст закона. Требование о локализации баз данных изложено по методике контроля Группы Сбер (источник) со ссылкой на часть 5 статьи 18; мы пересказываем её своими словами. Правовую квалификацию cookie и аналитики оставьте юристу: закон не называет их прямо, а подход зависит от того, позволяют ли они идентифицировать человека.

Что требуется от сайта

Требование Что это значит на практике
Политика обработки ПДн опубликована Оператор обязан опубликовать документ с политикой и сведения о реализуемых требованиях к защите ПДн или обеспечить к ним неограниченный доступ (статья 18.1, часть 2)
Политика на страницах сбора данных Оператор, собирающий данные через интернет, обязан опубликовать политику в сети, в том числе на страницах сайта, с использованием которых собираются данные, и обеспечить доступ к документу (часть 2 статьи 18.1). В методике Сбера проверяют размещение на ресурсе и на каждой странице со сбором
Согласие оформлено отдельно Согласие должно быть конкретным, предметным, информированным, сознательным и однозначным и оформлено отдельно от иных документов, которые подтверждает или подписывает человек (статья 9, часть 1): согласие на обработку ПДн
Совпадение с уведомлением Цели и категории данных в политике и формах совпадают с уведомлением в реестре: уведомление об обработке ПДн
Локализация баз данных При сборе данных граждан РФ, в том числе через интернет, первичная запись, хранение и обновление данных идут в базах на территории РФ (с исключениями закона)
Трансграничная передача Если форма или сервис отправляют данные за рубеж, нужно соблюдать порядок статьи 12: трансграничная передача

Шаг 1. Составьте перечень форм и точек сбора

Найдите все места, где человек оставляет данные: формы обратной связи, заказ звонка, регистрация, подписка, оформление заказа, чат-виджеты, формы вакансий, комментарии, опросы. Для каждой запишите, какие данные просят, для какой цели, где они сохраняются и кто получает копию (почта, CRM, подрядчик).

Шаг 2. Проверьте политику и согласие

  • Ссылка на политику есть на каждой странице с формой, в подвале и рядом с кнопкой отправки.
  • Политика описывает цели, категории данных, способы, сроки, права субъектов, контакты ответственного и сведения о реализуемых мерах защиты.
  • Согласие даётся отдельным действием (чекбокс, не отмеченный заранее), с понятной ссылкой на текст; текст согласия не слит с пользовательским соглашением или офертой.
  • Если данные используются для рассылок, согласие на рассылку отдельное.
  • Для каждой формы указана цель, соответствующая политике и уведомлению.

Шаг 3. Найдите сторонние сервисы

На сайтах накапливаются счётчики, виджеты, шрифты, карты, видео, рекламные пиксели и формы на сторонних сервисах. Каждый из них может получать данные посетителей (адрес, сведения об устройстве, поведение), а часть — и введённые данные. Скрипт ниже загружает страницу и показывает внешние домены, которые она подключает (скрипты, фреймы, картинки, стили, адреса отправки форм). Он находит кандидатов для проверки, но не видит то, что подгружается динамически после загрузки страницы. Используйте только для своего сайта.

#!/usr/bin/env python3
"""Показывает, какие внешние домены подключает страница вашего сайта: скрипты, фреймы, картинки, шрифты, формы.
Это первый шаг, чтобы найти передачу данных сторонним сервисам. Проверяйте только свой сайт.
Запуск: python3 site_third_parties.py https://example.com/ [https://example.com/contacts ...]
Код возврата 1, если найдены внешние домены."""
import sys
import urllib.request
from html.parser import HTMLParser
from urllib.parse import urljoin, urlparse


class Collector(HTMLParser):
    def __init__(self, base):
        super().__init__()
        self.base = base
        self.found = {}

    def add(self, kind, url):
        if not url or url.startswith(('data:', 'javascript:', 'mailto:', 'tel:', '#')):
            return
        host = urlparse(urljoin(self.base, url)).hostname
        if host:
            self.found.setdefault(host, set()).add(kind)

    def handle_starttag(self, tag, attrs):
        a = dict(attrs)
        if tag == 'script':
            self.add('script', a.get('src'))
        elif tag == 'iframe':
            self.add('iframe', a.get('src'))
        elif tag == 'img':
            self.add('img', a.get('src'))
        elif tag == 'link':
            self.add('link', a.get('href'))
        elif tag == 'form':
            self.add('form-action', a.get('action'))


def check(url):
    req = urllib.request.Request(url, headers={'User-Agent': 'site-third-parties/1.0'})
    with urllib.request.urlopen(req, timeout=20) as r:
        html = r.read().decode(r.headers.get_content_charset() or 'utf-8', errors='ignore')
    own = urlparse(url).hostname
    parser = Collector(url)
    parser.feed(html)
    return {h: k for h, k in parser.found.items() if h != own and not h.endswith('.' + own)}


def main():
    if len(sys.argv) < 2:
        sys.exit('Использование: site_third_parties.py URL [URL ...]')
    rc = 0
    for url in sys.argv[1:]:
        try:
            ext = check(url)
        except Exception as e:  # сеть и разбор: сообщаем и продолжаем
            print(f'{url}: ошибка {e}', file=sys.stderr)
            rc = max(rc, 2)
            continue
        print(f'== {url}')
        for host in sorted(ext):
            print(f'  {host}  ({", ".join(sorted(ext[host]))})')
        if ext:
            rc = max(rc, 1)
        else:
            print('  внешних доменов нет')
    return rc


if __name__ == '__main__':
    sys.exit(main())
python3 site_third_parties.py https://example.com/ https://example.com/contacts

Пример результата на учебной странице:

== http://localhost:8765/index.html
  cdn.example.net  (script)
  fonts.example.org  (link)
  mailer.example.net  (form-action)
  stats.example.com  (img)
  video.example.io  (iframe)

Код возврата 1, если найдены внешние домены. Дополнительно откройте сайт в браузере, вкладка «Сеть» инструментов разработчика, и просмотрите все запросы на других доменах, а также исходный код форм. Для каждого найденного сервиса ответьте: какие данные он получает, где он находится, есть ли договор, нужна ли отметка в уведомлении, нужно ли согласие, можно ли обойтись без него.

  • Разделите cookie на необходимые для работы сайта и дополнительные (аналитика, реклама).
  • Если по дополнительным cookie и идентификаторам можно идентифицировать человека или они передаются сторонним сервисам, юрист определяет основание обработки, и, как правило, требуется информирование и согласие.
  • Не загружайте рекламные и аналитические скрипты до согласия, если их использование требует согласия.
  • Опишите cookie и их назначение в политике, дайте возможность отказаться от необязательных.
  • Если сторонний сервис находится за границей, оцените требования к трансграничной передаче.

Шаг 5. Проверьте технику

  • HTTPS и защита форм. Данные передаются только по защищённому соединению: настройка SSL в nginx.
  • Защита от атак. Формы защищены от спама и подбора, сайт — от типовых атак: WAF и ограничения.
  • Хранение. Данные из форм не лежат в открытом доступе, письма с данными не пересылаются по незащищённой почте, доступ к панели управления только у уполномоченных.
  • Журналы. Журналы сайта не содержат лишних ПДн, доступ ограничен: журналы ИСПДн.
  • Копии и срок хранения. Определён срок хранения заявок и порядок уничтожения: уничтожение ПДн.

Диагностика

Симптом Причина и что делать
Политики нет на странице с формой Ссылку добавили только в подвал главной. Добавьте на каждую страницу сбора и рядом с кнопкой
Согласие внутри пользовательского соглашения Нарушено требование об отдельном оформлении. Выделите отдельный чекбокс и текст
Скрипт нашёл неизвестный домен Подключён плагин, виджет или счётчик. Выясните, кто его добавил, зачем, какие данные уходят; удалите или оформите основание
Данные из формы уходят в зарубежный сервис рассылок Нужны трансграничная передача и основание. Оцените замену на локальный сервис

Где это в моделях

Материал продолжает раздел «Регуляторика ПДн» и относится к направлению «Безопасность данных» (материалы направления, самопроверка оператора ПДн, карта зрелости). Публикация политики и формы сбора данных входят в базовый минимум оператора по методике Группы Сбер.

Как проверить

  1. На каждой странице с формой есть ссылка на актуальную политику, отдельное согласие оформлено по требованиям.
  2. Скрипт проверки запущен на ключевых страницах, для каждого внешнего домена определено назначение и основание.
  3. Цели и данные на сайте совпадают с уведомлением в реестре и политикой.
  4. Определены сроки хранения данных из форм, есть порядок ответа на запросы пользователей.

Источники

  • Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных», статьи 9, 12, 18.1, 22: КонсультантПлюс, Гарант. Проверяйте действующую редакцию.
  • Методика осуществления контроля соблюдения фокусными компаниями законодательства РФ в области персональных данных, Группа Сбер: sberbank.ru.
  • Размеры штрафов: штрафы за нарушения с ПДн.

Оставьте свой ответ