chore(i18n,curriculum): processed translations - new ukrainian (#44447)

This commit is contained in:
camperbot
2021-12-10 11:14:24 +05:30
committed by GitHub
parent 8651ee1797
commit 0473dedf47
1663 changed files with 156692 additions and 1 deletions

View File

@@ -0,0 +1,63 @@
---
id: 587d8248367417b2b2512c3c
title: Надавайте браузеру доступ до Вашого сайту тільки через HTTPS за допомогою helmet.hsts()
challengeType: 2
forumTopicId: 301573
dashedName: ask-browsers-to-access-your-site-via-https-only-with-helmet-hsts
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
HTTP Strict Transport Security (HSTS) - це політика веб-безпеки, яка допомагає захистити вебсайти від атак зниження рівня на протокол та крадіжку куки. Якщо доступ до вашого веб-сайту можна отримати через HTTPS-протокол, запобігайте використанню браузером незахищеного HTTPS-протоколу. Встановлюючи заголовок Strict-Transport-Security, ви вказуєте браузерам використовувати протокол HTTPS для майбутніх запитів протягом певного періоду часу. Це спрацює для запитів, які слідують після початкового запиту.
# --instructions--
Налаштуйте`helmet.hsts()`для використання HTTPS-протоколу протягом наступних 90 днів. Передайте об'єкт конфігурації`{maxAge: timeInSeconds, force: true}`. Ви можете створити змінну`ninetyDaysInSeconds = 90*24*60*60;` для застосування в `timeInSeconds`. Replit вже включає в себе hsts. Для зміни його налаштувань необхідно встановити поле "force" в об'єкті конфігурації. Ми перехопимо і відновимо заголовок Replit після перевірки.
Примітка: Налаштування HTTPS на вебсайті користувача передбачає придбання домену та SSL/TLS сертифікату.
# --hints--
проміжне програмне забезпечення helmet.hsts() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'hsts');
assert.property(data.headers, 'strict-transport-security');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
maxAge повинен дорівнювати 7776000 сек (90 днів)
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.match(
data.headers['strict-transport-security'],
/^max-age=7776000;?/
);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,42 @@
---
id: 587d8248367417b2b2512c3a
title: Уникайте передачі відповіді типу MIME через helmet.noSniff()
challengeType: 2
forumTopicId: 301574
dashedName: avoid-inferring-the-response-mime-type-with-helmet-nosniff
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту на [ Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [ GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/). Браузери можуть використовувати вміст або MIME аналіз, щоб замінити запити заголовків `Content-Type` для передбачення та обробки даних, використовуючи неявний тип вмісту. Окрім того, що такий процес може бути зручним для певних сценаріїв, він також призводить до деяких небезпечних атак. Таке проміжне програмне забезпечення закріплює заголовок X-Content-Type-Options на `nosniff`, вказуючи браузеру не обходити наданий `Content-Type`.
# --instructions--
Застосовуйте метод `helmet.noSniff()` на вашому сервері.
# --hints--
проміжне програмне забезпечення helmet.noSniff() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'nosniff');
assert.equal(data.headers['x-content-type-options'], 'nosniff');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,50 @@
---
id: 587d8249367417b2b2512c40
title: Налаштування Helmet за допомогою початкового елемента проміжного програмування helmet()
challengeType: 2
forumTopicId: 301575
dashedName: configure-helmet-using-the-parent-helmet-middleware
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
`app.use(helmet())` буде автоматично містити в собі все вище згадане проміжне програмне забезпечення, окрім `noCache()` і `contentSecurityPolicy()`, але їх можна застосувати за необхідності. Ви також можете відключити або налаштувати будь-яке інше проміжне програмування самостійно, використовуючи конфігураційний об'єкт.
**Наприклад:**
```js
app.use(helmet({
frameguard: { // configure
action: 'deny'
},
contentSecurityPolicy: { // enable and configure
directives: {
defaultSrc: ["'self'"],
styleSrc: ['style.com'],
}
},
dnsPrefetchControl: false // disable
}))
```
Ми представили окремо кожен тип проміжного програмного забезпечення для навчання і для полегшення тестування. В реальному проєкті легко реалізувати метод 'parent' з використанням `helmet()`.
# --hints--
відсутність тестів - це описове завдання
```js
assert(true);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,47 @@
---
id: 587d8249367417b2b2512c3e
title: Вимикання кешування Client-Side за допомогою helmet.noCache()
challengeType: 2
forumTopicId: 301576
dashedName: disable-client-side-caching-with-helmet-nocache
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Якщо ви випускаєте оновлення для вашого веб-сайту і хочете, щоб користувачі завжди завантажували новішу версію, ви можете спробувати вимкнути кешування в їхньому браузері. Це може бути корисним також у розробці. Проте використовуйте таку опцію лише за необхідністю, адже з ним кешування не покращує продуктивність як зазвичай.
# --instructions--
Використовуйте метод `helmet.noCache()` на вашому сервері.
# --hints--
проміжне програмне забезпечення helmet.noCache() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'nocache');
assert.equal(
data.headers['cache-control'],
'no-store, no-cache, must-revalidate, proxy-revalidate'
);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,44 @@
---
id: 587d8248367417b2b2512c3d
title: Вимкнення DNS-Prefetching за допомогою helmet.dnsPrefetchControl()
challengeType: 2
forumTopicId: 301577
dashedName: disable-dns-prefetching-with-helmet-dnsprefetchcontrol
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Щоб покращити продуктивність, більшість браузерів оновлюють записи DNS на сторінці посилання. Таким способом Ip-адреса отримувача уже відома, коли користувач натискає на посилання. Це може призвести до надмірного використання DNS-служби (якщо у вас великий веб-сайт, який відвідують мільйони людей…), проблем конфіденційності (злочинець зможе встановити, що ви перебуваєте на певній сторінці) або зміни статистики сторінки (деякі посилання можуть відображатись як вже відвідані навіть якщо вони не є такими). Якщо рівень безпеки для вас важливий, ви можете вимкнути попереднє перетворення доменних імен (DNS), втративши продуктивність.
# --instructions--
Застосовуйте метод `helmet.dnsPrefetchControl()` на вашому сервері.
# --hints--
проміжне програмне забезпечення helmet.dnsPrefetchControl() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'dnsPrefetchControl');
assert.equal(data.headers['x-dns-prefetch-control'], 'off');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,66 @@
---
id: 58a25bcff9fc0f352b528e7e
title: Синхронне перетворення паролів на дані та їх порівняння
challengeType: 2
forumTopicId: 301579
dashedName: hash-and-compare-passwords-synchronously
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту на [ Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt) або копіюється з [ GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/).
Синхронне перетворення паролів на дані (хешування) легко виконати, однак це може спричинити затримку, якщо використовувати його на серверній стороні з високою вартістю або з хешуванням, яке проводиться дуже часто. Перетворення таким методом так само легко виконати як і ввести
```js
var hash = bcrypt.hashSync(myPlaintextPassword, saltRounds);
```
Додайте цей метод хешування до свого коду і потім виведіть результат на консоль. Знову ж таки, змінні, що використовуються, вже визначені на сервері, тому вам не потрібно їх змінювати. Ви можете помітити, що незважаючи на те, що ви хешуєте ті самі паролі як і в асинхронному методі, результат на консолі відрізняється. Це пов'язано з випадково згенерованим модифікатором (сіль) кожного разу як створюються перші 22 символи в третьому рядку хешу. Щоб порівняти вхідний пароль з новим синхронним хешом, використайте метод compareSync:
```js
var result = bcrypt.compareSync(myPlaintextPassword, hash);
```
з результатом буде логічне значення true або false.
# --instructions--
Додайте функцію і увійдіть в консоль щоб побачити, як вона працює.
Підтвердіть вашу сторінку, якщо все зрозуміло.
# --hints--
Синхронне хешування необхідно правильно згенерувати і правильно синхронізувати.
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/server.js').then(
(data) => {
assert.match(
data,
/START_SYNC[^]*hash.*=.*bcrypt.hashSync.*myPlaintextPassword( |),( |)saltRounds[^]*END_SYNC/gi,
'You should call bcrypt.hashSync on myPlaintextPassword with saltRounds'
);
assert.match(
data,
/START_SYNC[^]*result.*=.*bcrypt.compareSync.*myPlaintextPassword( |),( |)hash[^]*END_SYNC/gi,
'You should call bcrypt.compareSync on myPlaintextPassword with the hash generated in the last line'
);
},
(xhr) => {
throw new Error(xhr.statusText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,40 @@
---
id: 587d8247367417b2b2512c37
title: Приховування потенційно небезпечної інформації за допомогою helmet.hidePoweredBy()
challengeType: 2
forumTopicId: 301580
dashedName: hide-potentially-dangerous-information-using-helmet-hidepoweredby
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Хакери можуть використовувати наявні недоліки в системі захисту в Express/Node, якщо вони бачать, що сайт працює на базі Express. Тег `X-Powered-By: Express` надсилається в кожен запит, що надійшов з Express за замовчуванням. Використовуйте проміжне програмне забезпечення `helmet.hidePoweredBy()`, щоб усунути заголовок X-Powered-By.
# --hints--
проміжне програмне забезпечення helmet.hidePoweredBy() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'hidePoweredBy');
assert.notEqual(data.headers['x-powered-by'], 'Express');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,53 @@
---
id: 587d8247367417b2b2512c36
title: Встановлення та вимоги до Helmet
challengeType: 2
forumTopicId: 301581
dashedName: install-and-require-helmet
---
# --description--
Робота над цими завданнями включає написання коду користуючись одним з методів наведених нижче:
- Створіть точну копію [ нашого репозиторія GitHub ](https://github.com/freeCodeCamp/boilerplate-infosec/) та завершіть ці завдання локально.
- Використовуйте [Replit sterter project](https://replit.com/github/freeCodeCamp/boilerplate-infosec) для виконання цих завдань.
- Для завершення завдань використовуйте обраний вами розробник сайтів. Переконайтеся, що ви зберегли всі файли з нашого репозиторію GitHub.
Після завершення, переконайтеся, що робоча демоверсія вашого проєкту розміщена у відкритому доступі. Потім введіть URL-адресу проєкту в поле `Solution Link`.
Helmet допоможе вам захистити ваші Express-програми, встановивши різноманітні HTTP заголовки.
# --instructions--
Весь ваш код для цих уроків розміщується в файл `myApp.js` між рядками коду, з якого ми почали вам писати. Не змінюйте та не видаляйте код, який ми додали для вас.
Встановіть версію Helmet`3.21.3`, це необхідно. Ви можете встановити певну версію пакету за допомогою `npm install --save-exact package@version`, або додавши його безпосередньо до `package.json`.
# --hints--
Версія `helmet``3.21.3` повинна бути в `package.json`
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/package.json').then(
(data) => {
const packJson = JSON.parse(data);
const helmet = packJson.dependencies.helmet;
assert(helmet === '3.21.3' || helmet === '^3.21.3');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,64 @@
---
id: 587d8247367417b2b2512c38
title: Зменшення ризику клікджекінгу за допомогою helmet.frameguard()
challengeType: 2
forumTopicId: 301582
dashedName: mitigate-the-risk-of-clickjacking-with-helmet-frameguard
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Ваша сторінка може бути задана `<frame>` або `<iframe>` без вашої згоди. З-поміж інших атак, це може призвести до атак клікджекінгу. Клікджекінг - це механізм обману інтернет-користувача, при якому користувач заманюється на зовні знайому йому сторінку, яка вже змінена хакером. Такий механізм можливий, якщо вашу сторінку використовують в зловмисних цілях за допомогою перенаправлення iframing. У такій ситуації хакер розміщує поверх видимої сторінки невидимий шар. Невидимі елементи управління (кнопки, посилання) запускають ворожий скрипт. Це проміжне програмне забезпечення встановлює заголовок X-Frame-Options. Воно обмежує дії хакерів, які можуть перенаправити вашу сторінку. Доступні три режими: DENY, SAMEORIGIN і ALLOW-FROM.
Немає потреби перенаправляти наш додаток.
# --instructions--
Використовуйте `helmet.frameguard()`, що сходиться з об’єктом конфігурації `{action: 'deny'}`.
# --hints--
проміжне програмне забезпечення helmet.frameguard() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(
data.appStack,
'frameguard',
'helmet.frameguard() middleware is not mounted correctly'
);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
helmet.frameguard() 'action' слід встановити в режимі 'DENY'
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.property(data.headers, 'x-frame-options');
assert.equal(data.headers['x-frame-options'], 'DENY');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,51 @@
---
id: 587d8247367417b2b2512c39
title: >-
Зниження ризику атак міжсайтового скриптингу (XSS) за допомогою helmet.xssFilter()
challengeType: 2
forumTopicId: 301583
dashedName: mitigate-the-risk-of-cross-site-scripting-xss-attacks-with-helmet-xssfilter
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Міжсайтовий скриптинг (XSS) - це частий тип атаки, під час якої зловмисні скрипти потрапляють на вразливі сторінки, з метою крадіжки конфіденційних даних, таких як сеансові файли кукі або паролі.
Основне правило для зниження ризику атаки XSS просте: ''Ніколи не довіряйте користувачам''. Як розробнику, вам слід завжди обробляти всі вхідні дані ззовні. Це включає дані, що надходять з форм, URL запитів GET і навіть з HTTP POST. Обробка означає, що вам слід знайти і закодувати символи, які можуть виявитись небезпечними.e.g. &lt;, >.
Сучасні браузери можуть допомогти зменшити ризик за допомогою залучення кращих стратегій програмного забезпечення. Часто це можна налаштувати за допомогою http-заголовків.
Заголовок X-XSS-Protection HTTP - це основний захист. Браузер виявляє потенційний ін'єктивний скрипт за допомогою евристичного фільтру. Якщо застосовано заголовок, браузер змінює код скрипту, нейтралізуючи його. Він все ще має обмежену підтримку.
# --instructions--
Використовуйте `helmet.xssFilter()` для збереження даних на ваш сервер.
# --hints--
проміжне програмне забезпечення helmet.xssFilter() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'xXssProtection');
assert.property(data.headers, 'x-xss-protection');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,44 @@
---
id: 587d8248367417b2b2512c3b
title: Запобігти відкриванню ненадійних HTML кодів браузером Internet Explorer за допомогою helmet.ieNoOpen()
challengeType: 2
forumTopicId: 301584
dashedName: prevent-ie-from-opening-untrusted-html-with-helmet-ienoopen
---
# --description--
Нагадуємо, що цей проект створюється на основі наступного початкового проекту [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Деякі веб-додатки будуть пропонувати завантажувати ненадійний HTML код. За змовчуванням деякі версії браузера Internet Explorer відкривають такі HTML файли в залежності від вашого сайту. Це означає, що ненадійна HTML сторінка може отримати несанкціонований доступ до ваших вкладок. Це проміжне програмне забезпечення встановлює заголовок X-Frame-Options, щоб не відкривати такі файли. Це дозволить користувачам Internet Explorer виконувати завантаження на надійних сайтах.
# --instructions--
Застосовуйте метод `helmet.ieNoOpen()` на вашому сервері.
# --hints--
проміжне програмне забезпечення helmet.ieNoOpen() необхідно правильно встановити
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'ienoopen');
assert.equal(data.headers['x-download-options'], 'noopen');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,71 @@
---
id: 587d8249367417b2b2512c3f
title: Встановіть Політику Безпеки Контенту за допомогою helmet.contentSecurityPolicy()
challengeType: 2
forumTopicId: 301585
dashedName: set-a-content-security-policy-with-helmet-contentsecuritypolicy
---
# --description--
В якості нагадування, цей проєкт створюється за початковим проєктом [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec), або копіюється з [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/).
Це завдання наголошує на одному новому перспективному захисті, за допомогою якого можна значно скоротити ризик та вплив багатьох видів атак в сучасних браузерах. Встановлюючи та налаштовуючи Політику Безпеки Контенту, ви можете запобігти проникнення всього небажаного на вашу сторінку. Це захистить ваш додаток від вразливостей XSS, небажаного відстеження, шкідливих фреймів, та багато іншого. CSP працює шляхом визначення дозволеного списку джерел контенту, яким довіряють. Ви можете налаштувати їх для кожного типу ресурсів, який може знадобитися на вебсторінці (алгоритми, таблиці стилів, шрифти, рамки, медіа, тощо...). Існує декілька доступних директив, тому власники вебсайтів можуть мати детальний контроль. Для більш детальної інформації перегляньте HTML 5 Rocks, KeyCDN. На жаль, CSP не підтримується старішим браузером.
За замовчуванням, директиви знаходяться у загальному доступі, тому важливо встановити директиву defaultSrc, як резервну. Helmet підтримує такі стилі іменування, як defaultSrc та default-src. Резервний варіант застосовується для більшості невизначених директив.
# --instructions--
У цій вправі використовуйте `helmet.contentSecurityPolicy()`. Налаштуйте його, додавши об’єкт `directives`. В об'єкті, встановіть значення `defaultSrc` на `["'self'"]` (список дозволених джерел має бути в масиві), для того, щоб довіряти лише адресі вашого вебсайту, за замовчуванням. Також встановіть директиву `scriptSrc`, щоб ви могли завантажувати скрипти лише з вашого вебсайту (`'self'`), та з домену `'trusted-cdn.com'`.
Підказка: в ключовому слові `'self'` одинарні лапки є частиною ключового слова, тому його потрібно взяти в подвійні лапки, щоб воно працювало.
# --hints--
проміжне програмне забезпечення helmet.contentSecurityPolicy() повинно бути правильно встановлене
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
assert.include(data.appStack, 'csp');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
Ваша конфігурація csp неправильна. Значення за замовчуванням Src має бути ["'self'"] та scriptSrc повинно бути ["'self'", 'trusted-cdn.com']
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/app-info').then(
(data) => {
var cspHeader = Object.keys(data.headers).filter(function (k) {
return (
k === 'content-security-policy' ||
k === 'x-webkit-csp' ||
k === 'x-content-security-policy'
);
})[0];
assert.equal(
data.headers[cspHeader],
"default-src 'self'; script-src 'self' trusted-cdn.com"
);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```

View File

@@ -0,0 +1,72 @@
---
id: 58a25bcef9fc0f352b528e7c
title: Розуміння функції BCrypt
challengeType: 2
forumTopicId: 301586
dashedName: understand-bcrypt-hashes
---
# --description--
У наступних завданнях ви будете працювати з новим початковим проєктом, який відрізняється від попереднього. Ви можете знайти новий початковий проект на [Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt)або скопіювати його з [GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/).
Функція BCrypt відзначається своєю надійністю. Хеш - це, по суті, "відбиток" початкових даних, який завжди лишається унікальним. Така функція виконується шляхом введення початкових даних в алгоритм і виведення фіксованого результату довжини. Щоб ускладнити процес і зробити його безпечнішим, ви можете застосувати випадково згенерований модифікатор *salt* для хешу. Випадкова генерація хешу включає в себе додавання випадкових даних до початкових даних перед процесом хешування, що ускладнює крадіжку хешу.
Функція BCrypt завжди виглядає як код `$2a$13$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm`, що має структуру. Перший невеликий біт даних `$2a` визначає, який алгоритм хешу був використаний. Наступна частина `$13` визначає *cost*. Cost показує наскільки важко вичислити хеш. Цей елемент розміщений на логарифмічній шкалі 2^cost і визначає скільки разів дані проходять крізь алгоритм хешування. Наприклад, якщо cost дорівнює 10, ви можете перетворити 10 паролів за секунду на середньостатистичному комп'ютері, однак при значенні cost 15 - це займе 3 секунди за один результат... і, відповідно, при значенні 31, процес займе кілька днів, щоб отримати готовий хеш. Значення cost 12 вважається найбезпечнішим на сьогодні. Остання частина хешу `$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm` виглядає як один великий рядок чисел, періодів і букв, але насправді це дві окремі деталі. Перші 22 символи це згенерований модифікатор у вигляді простого тексту, решта - перетворений пароль!
# --instructions--
Щоб почати використовувати BCrypt, додайте його як пакет у код вашого проєкту і запускайте його за допомогою значення 'bcrypt' на вашому сервері.
Додайте весь ваш код для цих уроків в файл `server.js` між рядками коду, з якого ми почали. Не змінюйте і не видаляйте код, який ми додали для вас.
Підтвердіть свою сторінку, коли зрозумієте, що все працює коректно.
# --hints--
BCrypt повинен бути пакетом в коді.
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/package.json').then(
(data) => {
var packJson = JSON.parse(data);
assert.property(
packJson.dependencies,
'bcrypt',
'Your project should list "bcrypt" as a dependency'
);
},
(xhr) => {
throw new Error(xhr.statusText);
}
);
```
Потрібно правильно запустити BCrypt.
```js
(getUserInput) =>
$.get(getUserInput('url') + '/_api/server.js').then(
(data) => {
assert.match(
data,
/bcrypt.*=.*require.*('|")bcrypt('|")/gi,
'You should correctly require and instantiate socket.io as io.'
);
},
(xhr) => {
throw new Error(xhr.statusText);
}
);
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```