Node Hero: Частина 11 - Безпека у Node.js-застосунках

5 хв. читання

Загрози безпеці

У наші дні майже кожен день трапляються якісь проблеми з безпекою, наприклад випадки з LinkedIn та MySpace. Протягом цих атак відбувся витік дуже великої кількості інформації користувачів, не кажучи вже про завдання шкоди репутації корпорації.

Дослідження також показали, що запити на баги, пов'язані з безпекою, зазвичай не закриваються протягом 18 місяців у деяких компаніях.

Нам потрібно виправити таку ситуацію. Якщо ви розробляєте програмне забезпечення, безпека - це частина вашої роботи.

Безпека у Node.js-застосунках

Давайте застрахуємо наш Node.js-застосунок використовуючи правильні код, інструменти та операції!

Стиль безпечного кодування

Правило 1: Не використовуйте eval

Eval може відкрити ваш застосунок для атак. Намагайтесь не використовувати її, але якщо вам це потрібно, ніколи не подавайте на вхід неперевірений користувацький ввід у eval.

Це не єдине, що вам слід уникати - є також наступні вирази, які використовують eval:

  • setInterval(String, 2)

  • setTimeout(String, 2)

  • new Function(String)

Правило 2: Завжди використовуйте режим strict

З 'use strict' ви використовуєте тільки обмежений "варіант" JavaScript. Це виключить деякі помилки.

'use strict'  
delete Object.prototype  
// TypeError
var obj = {  
    a: 1, 
    a: 2 
} 
// помилка синтаксису

Правило 3: Обробляйте помилки обережно

Під час різних сценаріїв помилок, у вашому застосунку може бути витік конфіденційних відомостей про базову інфраструктуру, наприклад: X-Powered-By:Express.

Трасування стеку може бути само по собі не такими цінними, але воно часто видає інформацію, яка може бути цікавою атакуючому. Надання інформації про налагодження в результаті операцій, які генерують помилки, вважається поганою практикою. Ніколи не показуйте її користувачам.

Правило 4: робіть статичний аналіз вашої бази коду

Статичний аналіз у базі коду вашого застосунку може виявити багато помилок. Для цього ми рекомендуємо використовувати ESLint із стилем кодування Standard.

Безпечний запуск ваших застосунків

Використовувати правильний стиль кодування ще не достатньо, щоб ефективно застрахувати ваші Node.js-застосунки - ви повинні бути обережними щодо способу їх запуску.

Правило 5: Не запускайте ваші процеси з правами суперкористувача

На жаль, ми часто це спостерігаємо: розробники запускають їхні застосунки з правами суперкористувача, коли хочуть використати порти 80 та 443.

Це не правильно. У разі помилки/багу, ваш процес може порушити всю систему, тому що він має дозвіл робити все що завгодно.

Замість цього ви можете налаштувати сервер HTTP/проксі, щоб відповідати на запити. Це може бути nginx або Apache.

Правило 6: Налаштовуйте обов'язкові заголовки HTTP

Є деякі заголовки HTTP, пов'язані з безпекою, які ваш сайт повинен обов'язково мати.

  • Strict-Transport-Security забезпечує дотримання безпечних (HTTP через SSL/TLS) зв'язків з сервером

  • X-Frame-Options забезпечує захист clickjacking

  • X-XSS-Protection дозволяє міжсайтовий фільтр скриптингу (XSS), який вбудовано у найновіші браузери

  • X-Content-Type-Options захищає браузери від контект-сніфінгу

  • Content-Security-Policy захищає від багатьох атак, включаючи міжсайтовий скриптинг та інші міжсайтові ін'єкції

У Node.js легко це налаштувати, використовуючи модуль Helmet.

var express = require('express')  
var helmet = require('helmet')

var app = express()

app.use(helmet())  

Helmet також доступний для Koa: koa-helmet.

Правило 7: Правильне управління сесіями

Наступний список флажків повинен бути налаштований для кожного cookie:

  • secure - цей атрибут каже браузеру відсилати cookie лише якщо запит було відправлено через HTTPS.

  • HttpOnly - цей атрибут використовується, щоб запобігти міжбраузерному скриптингу.

Правило 8: Встановіть область дії cookie

  • domain - цей атрибут використовується для порівняння доменів сервера, у якому робиться запит URL. Якщо домени співпадають або якщо це піддомен, то наступною буде перевірка атрибуту маршруту.

  • path - перевіряє відповідність маршруту та домену, якщо домен та маршрут співпадають, то cookie буде відсилатися на запит.

  • expires - цей атрибут використовується для налаштування постійних cookie.

У Node.js ви можете легко створити cookie використовуючи пакет cookies. Знову ж, це достатньо низькорівнево, так що ви скоріш за все будете використовувати обгортку, наприклад cookie-session.

var cookieSession = require('cookie-session')  
var express = require('express')

var app = express()

app.use(cookieSession({  
  name: 'session',
  keys: [
    process.env.COOKIE_KEY1,
    process.env.COOKIE_KEY2
  ]
}))

app.use(function (req, res, next) {  
  var n = req.session.views || 0
  req.session.views = n++
  res.end(n + ' views')
})

app.listen(3000)  

Інструменти

Правило 9: Шукайте вразливі точки з Retire.js

Ціль Retire.js - допомогти вам виявляти прогалини у роботі з різними версіями модулів.

Просто встановіть його з:

npm install -g retire  

Після його запуску буде шукати вразливі точки у вашому директорії node_modules. (Зверніть увагу, що retire.js працює не тільки з модулями node, але і з бібліотеками зовнішнього інтерфейсу.)

Правило 10: Перевіряйте ваші модулі з клієнтом Node Security Platform

nsp - це основний інтерфейс командного рядка для Node Security Platform. Він дає змогу перевіряти файли package.json або npm-shrinkwrap.json з NSP API, щоб виявити прогалини.

npm install nsp --global  
# З директорію вашого проекту
nsp check  
Далі: Частина 12 - Як розгортати Node.js-застосунки на Heroku або Docker
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.8K
Приєднався: 6 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація

Читайте також: use strict, x frame options, node сервер