# Client side security - Practice
К решению прикладывайте скриншоты и код, который добавили в `client-side-playground`.
Можете оставить комментарии к результатам, например, почему произошла ошибка.
## 1. SOP
### 1.1 `iframe` / window
Вместо `iframe` можно открывать новое окно.
- [ ] Открыть `iframe` со страницей на **том же** `Origin`.

- [ ] Прочитать содержимое `iframe` из Javascript.

удалось прочитать содержимое из iframe
- [ ] Открыть `iframe` со страницей на **другом** `Origin`.

- [ ] Прочитать содержимое `iframe` из Javascript.

не удалось прочитать содержимое iframe из другого origin
### 1.2 inherited origins
- [ ] С основной страницы открыть окно `about:blank` и посмотреть `Origin` (`document.domain`).

about:blank наследует origin родителя
- [ ] С основной страницы открыть окно со схемой `data:` и посмотреть `Origin`.

data: не наследует origin
### 1.3 changing origin
- [ ] Открыть страницу с одного поддомена (`a.hu.io`).
- [ ] С первой страницы открыть другую со второго домена (`b.hu.io`).
- [ ] Проверить взаимную доступность DOM через `Window` объект и `window.opener` соответственно.


доступ для страниц из разных origin-ов отсудствует
- [ ] Провести смену домена (`document.domain = 'hu.io'`) и повторитть проверку.


при помощи document.domain удалось сменить origin-контекст и получить доступ к документам
- [ ] Открыть страницу с `Feature-Policy: document-domain 'none';` и попробовать сменить домен.


в firefox можно сменить домен на родительский, но нельзя на сторонний.

в chrome нельзя сменить origin (даже на родительский)
### 1.4 interpage communication
- [ ] Сделать страницу, которая слушает сообщения и возвращает их обратно через `postMessage`.
- [ ] Обеспечить, чтобы обратное сообщение получила страница с тем же `Origin`.


на скрине видно, что принимающий скрипт на origin-e b.hu.io не пересылает сообщение обратно отправителю a.hu.io;
а если origin отправителя и получателя совпадают - то отправитель получит свое сообщение обратно
### 1.5 Cross-Origin-Opener-Policy
- [ ] Сделать страницу, которая возвращает заголовок `Cross-Origin-Opener-Policy: same-origin`.

- [ ] Открыть эту страницу с другой страницы с **таким же** `Origin` и отличающимся.
- [ ] В обоих случаях посмотреть на `Window` объект и значение `window.opener`.
без заголовка `Cross-Origin-Opener-Policy: same-origin` мы можем получить доступ к `window.opener`


после установки заголовка `Cross-Origin-Opener-Policy: same-origin` в `window.opener` уже содержится null


## 2. CORS
### 2.1 forms
- [ ] Сделать форму, которая отправляет POST запрос на другой `Origin`.
- [ ] Посмотреть на предаваемые в запросе заголовки.

Успешно сливаются данные на другой origin
### 2.2 simple
- [ ] Выставить куки на домене `b.hu.io`.

- [ ] Реализовать эндпоинт-обработчик POST запроса, который возвращает:
- `Access-Control-Allow-Origin: <request_origin>`
- [ ] Сделать запрос с `a.hu.io` на этот эндпоинт.
- [ ] Посмотреть, были ли присланы куки.

cookies не отправлялись т.к. мы не установили флаг withCredentials
- [ ] Реализовать эндпоинт-обработчик POST запроса, который возвращает:
- `Access-Control-Allow-Origin: *`
- `Access-Control-Allow-Credentials: true`
- [ ] Сделать запрос с `a.hu.io` на этот эндпоинт.
- [ ] Описать ошибку из консоли.

запрос успешно был принят сервером и обработан браузером. ошибки в консоли не было
скорее всего упущен пункт о том,что надо установить флаг
withCredentials. Если выполнять с ним - то мы получим ошибку о том, что для запроса с credentials мы не можем определять `Access-Control-Allow-Origin: *` звездочкой, необходимо указать конкретный origin.

### 2.3 preflight
- [ ] Реализовать эндпоинт, отвечающий на методы `OPTIONS` и `POST`. На `POST` **только с кукой**.
- [ ] Настроить хедеры в ответах так, чтобы запрос с другого `Origin` успешно отрабатывал и получал JSON-значение в ответ. (Разрешение кросс-сайт авторизованных запросов)
по постановке задачи есть простая реализация без preflight, в ответе отдается json и куки тоже нормально отправляются

поскольку тут нужно именно preflight - то решение будет следующим




## 3. CSP
### 3.1 default
- [ ] Реализовать страницу, на которую можно загружать ресурсы только с того же `Origin`, а картинки из любого места.
- [ ] Предъявить CSP.


при помощи CSP для картинок разрешили загрузку со всех доменов, а для всех остальных ресурсов разрешили загрузку ресурсов только с текущего origin
### 3.2 unsafe-inline
- [ ] Реализовать страницу, на которую нельзя ничего загружать, но можно использовать inline стили и скрипты.
- [ ] Предъявить CSP.


видим, что встроеный JS и стили применились, в то время как сторонний ресурс был заблокирован
### 3.3 connect-src
- [ ] Разрешить обращения через `Fetch API` только на **другой** `Origin`.
- [ ] Предъявить CSP.
если в этом задании под другим ресурсом подразумевается один другой конкретный (например, b.hu.io) - то решение имеет вид:



мы видим, что загрузился и выполнился только 1 js - с origin b.hu.ui
Если же по заданию нужно запретить загрузку из текущего origin и разрешить все остальные - то это невозможно (политики подразумевают работу по белым спискам, а все сайты мы перечислить не можем)
https://stackoverflow.com/questions/46831368/content-security-policy-as-a-blacklist
### 3.4 framing
- [ ] Сделать вложенную структуру из фреймов следующего вида:
1. Главная страница - origin='a.hu.io'.
2. Фрейм 1 на главной странице - origin='b.hu.io', защиты нет.
3. Фрейм 2 внутри фрейма 1 - origin='b.hu.io', защита `Same-Origin`.
- [ ] Для фрейма 2 разрешить `Same-Origin` фрейминг сначала с помощью `X-Frame-Options`, а потом с помощью `frame-ancestors`. Сравнить результаты.


для firefox 86.0 результат эксперимента показал одинаковый результат
### 3.5 subresource integrity
- [ ] Вставить скрипт с CDN jquery с `integrity` и `crossorigin` аттрибутами. Проверить, что работает.


- [ ] Испортить хеш и посмотреть на ошибки.

браузер не стал загружать 'битую' библиотеку
- [ ] Убрать атрибуты `integrity` и `crossorigin` и разрешить эту библиотеку через CSP.
не понятна суть проверок т.к. в данном блоке CSP мы не настраивали и вставка без аттрибутов `integrity` и `crossorigin` приведет к класическому способу подключения js-библиотек.
## 4. Cookies
### 4.1 cookies identity
- [ ] Проверить пример из секции `Cookies identity`. Показать, какие куки прилетают.



отправляются все установленные cookies
### 4.2 same-site
- [ ] Выставить разные по значению куки на поддоменах `a.hu.io` и `b.hu.io`, на корень, с `SameSite=Strict`.
- [ ] Сделать запросы на оба поддомена. Посмотреть какие куки прилетают.




установлены cookies на 4 домена hu.io, .hu.io, a.hu.io, b.hu.io


при выполнении запросов на домены a.hu.io и b.hu.io
отправляются cookies для доменов a.hu.io,.hu.io; b.hu.io,.hu.io соответственно.
### 4.3 history API
- [ ] Выставить разные куки на разные пути.


- [ ] Поменять путь документа с помощью History API.
- [ ] Отправить запрос на сервер. Посмотреть для какого пути прилетают куки.

поменял location для страницы с page1 на path2, сделал запрос на path2 и вижу что cookies отправляются для path2, хотя ожидалось что будут отправлены для path1
Вывод: Firefox 86.0 меняет контекст для cookies при использовании History Api, к запросу добавляется та cookies, которая соответствует path в для текущего запроса
Повторный эксперимент для статической картинки с относительным путем:


## 5. Other
### 5.1 mixed content
- [ ] Сделать страницу, которая включает как HTTPS ресурсы, так и HTTP.
- [ ] Посмотреть ошибки в консоли.

браузер не блокирует mixed insecure content
### 5.2 nosniff
- [ ] Сделать страницу, которая включает в качестве скрипта текстовый файл с расширением `.txt`.

- [ ] Посмотреть, выполнится ли скрипт.


скрипт выполняется, наблюдаем warning
- [ ] Добавить в ответ сервера исходной страницы `X-Content-Type-Options: nosniff`.
- [ ] Посмотреть, выполнится ли скрипт. Посмотреть на ошибки в консоли.

После включения заголовка `X-Content-Type-Options: nosniff` браузер перестал выполнять скрипт
### 5.3 referer
- [ ] Сделать `Same-Origin` и `Cross-Origin` запросы со страницы. Посмотреть в каком виде летит `Referer`.


Referer приходит в виде полного URI
- [ ] Запретить отправку `Referer` с этой страницы через `Referer-Policy`. Проверить на запросах из первого пункта.



после запрета передачи Referer у нас заголовок Referer перестал передаваться вообще Referer
### 5.4 spying service worker
- [ ] Установить шпионящего `Service Worker` на поддомен `a.hu.io`, который отправляет пути и параметры запросов на домен `b.hu.io`.



реализован `Service Worker`-шпион, который сливает всю информацию по запросам на сторонний домен `b.hu.io`