В тази статия ще представя npm библиотека Helmet, която помага да защитите вашите експресни Js приложения. Както се казва в първия ред на Helmet npm docs

Helmet ви помага да защитите своите Express приложения, като зададете различни HTTP заглавки. Това не е сребърен куршум, но може да помогне!

Как работи?

Функцията helmet от най-високо ниво е обвивка около 15 по-малки междинни програми, 11 от които са активирани по подразбиране.

15-те междинни софтуера включват -

  1. contentSecurityPolicy
  2. crossOriginEmbedderPolicy
  3. crossOriginOpenerPolicy
  4. crossOriginResourcePolicy
  5. очаквайте CT
  6. референтна политика
  7. hsts
  8. noSniff
  9. originAgentCluster
  10. dnsPrefetchControl
  11. ieNoOpen
  12. рамкова защита
  13. permittedCrossDomainPolicies
  14. hidePoweredBy
  15. xssFilter
// This...
app.use(helmet());

// ...is equivalent to this:
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());

Как да деактивирам конкретен междинен софтуер?

Да приемем, че искате да деактивирате средата на рамката в конфигурацията на вашия шлем. Можете просто да подадете false като стойност към обекта на междинния софтуер.

app.use(
  helmet({
    frameguard: false,
  })
);

Как да конфигурирате конкретно свойство на междинен софтуер?

Да кажем, че за междинен софтуер referrerPolicy трябва да зададете свойството referrerPolicy.

app.use(
  helmet({
    referrerPolicy: { policy: "no-referrer" },
  })
);

Можете да получите списък с всички налични директиви в документацията на каската. Helmet също така поддържа реализации на Typescript. Освен това, тъй като е съвместим с всички експресни JS рамки, е много добър избор да го интегрирате със следващия си проект NestJS.

Политика за сигурност на съдържанието

helmet.contentSecurityPolicy задава Content-Security-Policy заглавката, която помага за смекчаване на атаките със скриптове между сайтове, наред с други неща

Списък с налични директиви за contentSecurityPolicy

default-src 'self';
base-uri 'self';
block-all-mixed-content;
font-src 'self' https: data:;
frame-ancestors 'self';
img-src 'self' data:;
object-src 'none';
script-src 'self';
script-src-attr 'none';
style-src 'self' https: 'unsafe-inline';
upgrade-insecure-requests
app.use(
  helmet.contentSecurityPolicy({
    useDefaults: true,
    directives: {
      "script-src": ["'self'", "example.com"],
      "style-src": null,
    },
  })
);

Политика за вграждане на различни източници

Заглавката на отговора HTTP Cross-Origin-Embedder-Policy (COEP) не позволява на документ да зареди ресурси от различен произход, които не предоставят изрично разрешение за документа

app.use(helmet({ crossOriginEmbedderPolicy: true }));

Политика за отваряне на различни източници

Заглавката на отговора HTTP Cross-Origin-Opener-Policy (COOP) ви позволява да гарантирате, че документ от най-високо ниво не споделя контекстна група за сърфиране с документи от различен произход.

// Sets "Cross-Origin-Opener-Policy: same-origin"
app.use(helmet({ crossOriginOpenerPolicy: true }));

// Sets "Cross-Origin-Opener-Policy: same-origin-allow-popups"
app.use(
  helmet({ crossOriginOpenerPolicy: { policy: "same-origin-allow-popups" } })
);

Политика за различни източници на ресурси

Заглавката на отговора HTTP Cross-Origin-Resource-Policy предава желание браузърът да блокира не-cors cross-origin/cross-site заявки към дадения ресурс.

// Sets "Cross-Origin-Resource-Policy: same-origin"
app.use(helmet({ crossOriginResourcePolicy: true }));

// Sets "Cross-Origin-Resource-Policy: same-site"
app.use(helmet({ crossOriginResourcePolicy: { policy: "same-site" } }));

Прозрачност на сертификата

Прозрачност на сертификата е отворена рамка, предназначена да защитава и наблюдава за неправилно издаване на сертификати. Новоиздадените сертификати се „регистрират“ в публично управлявани, често независими CT регистрационни файлове, които поддържат криптографски осигурен запис само за добавяне на издадени TLS сертификати.

app.use(
  helmet.expectCt({
    maxAge: 86400,
    enforce: true,
    reportUri: "https://example.com/report",
  })
);

Referrer-Политика

Referrer-Policy HTTP заглавката контролира колко информация за референт (изпратена с Referer заглавката) трябва да бъде включена в заявките. Освен HTTP заглавката, можете да зададете тази политика в HTML.

// Sets "Referrer-Policy: no-referrer"
app.use(
  helmet.referrerPolicy({
    policy: "no-referrer",
  })
);

// Sets "Referrer-Policy: origin,unsafe-url"
app.use(
  helmet.referrerPolicy({
    policy: ["origin", "unsafe-url"],
  })
);

Строга транспортна сигурност

Заглавката на отговора HTTP Strict-Transport-Security (често съкратено като HSTS) позволява на уеб сайт да каже на браузърите, че трябва да се осъществява достъп само чрез HTTPS, вместо чрез HTTP.

// Sets "Strict-Transport-Security: max-age=123456; includeSubDomains"
app.use(
  helmet.hsts({
    maxAge: 123456,
  })
);

// Sets "Strict-Transport-Security: max-age=123456"
app.use(
  helmet.hsts({
    maxAge: 123456,
    includeSubDomains: false,
  })
);

// Sets "Strict-Transport-Security: max-age=123456; includeSubDomains; preload"
app.use(
  helmet.hsts({
    maxAge: 63072000,
    preload: true,
  })
);

X-Content-Type-Options

HTTP заглавката на отговора X-Content-Type-Options е маркер, използван от сървъра, за да покаже, че типовете MIME, рекламирани в заглавките Content-Type, трябва да се следват и да не се променят. Заглавката ви позволява да избегнете снифиране на MIME тип, като казва, че типовете MIME са умишлено конфигурирани.

app.use(helmet.noSniff());
// This middleware takes no options

Клъстер на агент на произход

задава заглавката Origin-Agent-Cluster, която осигурява механизъм, позволяващ на уеб приложенията да изолират своя произход

app.use(helmet({ originAgentCluster: true }));

X-DNS-Prefetch-Control

Заглавката на HTTP отговора X-DNS-Prefetch-Control контролира предварителното извличане на DNS, функция, чрез която браузърите проактивно извършват разрешаване на имена на домейни както на връзки, които потребителят може да избере да следва, така и на URL адреси за елементи, посочени в документа, включително изображения, CSS, JavaScript и т.н. .

// Sets "X-DNS-Prefetch-Control: off"
app.use(
  helmet.dnsPrefetchControl({
    allow: false,
  })
);

// Sets "X-DNS-Prefetch-Control: on"
app.use(
  helmet.dnsPrefetchControl({
    allow: true,
  })
);

IeNoOpen

задава заглавката X-Download-Options, която е специфична за Internet Explorer 8. Принуждава запазването на потенциално опасни изтегляния, смекчавайки изпълнението на HTML в контекста на вашия сайт

app.use(helmet.ieNoOpen());

X-Frame-Опции

Заглавката на отговора X-Frame-Options HTTP може да се използва, за да посочи дали на браузър трябва да бъде разрешено да изобразява страница в <frame>, <iframe>, <embed> или <object>. Сайтовете могат да използват това, за да избегнат атаки с кликване, като гарантират, че тяхното съдържание не е вградено в други сайтове.

// Sets "X-Frame-Options: DENY"
app.use(
  helmet.frameguard({
    action: "deny",
  })
);

// Sets "X-Frame-Options: SAMEORIGIN"
app.use(
  helmet.frameguard({
    action: "sameorigin",
  })
);

Разрешени политики за кръстосани домейни

helmet.permittedCrossDomainPolicies задава заглавката X-Permitted-Cross-Domain-Policies, която казва на някои клиенти (предимно продукти на Adobe) политиката на вашия домейн за зареждане на съдържание между домейни

// Sets "X-Permitted-Cross-Domain-Policies: none"
app.use(
  helmet.permittedCrossDomainPolicies({
    permittedPolicies: "none",
  })
);

// Sets "X-Permitted-Cross-Domain-Policies: by-content-type"
app.use(
  helmet.permittedCrossDomainPolicies({
    permittedPolicies: "by-content-type",
  })
);

Скриване Осъществено от

helmet.hidePoweredBy премахва заглавката X-Powered-By, която е зададена по подразбиране в някои рамки (като Express)

app.use(helmet.hidePoweredBy());

X-XSS-защита

Заглавката на отговора HTTP X-XSS-Protection е функция на Internet Explorer, Chrome и Safari, която спира зареждането на страниците, когато открият отразени атаки на междусайтови скриптове (XSS). Тези защити са до голяма степен ненужни в съвременните браузъри, когато сайтовете прилагат силен Content-Security-Policy, който деактивира използването на вграден JavaScript ('unsafe-inline').

// Sets "X-XSS-Protection: 0"
app.use(helmet.xssFilter());

Резюме на употребите