В тази статия ще представя npm библиотека Helmet, която помага да защитите вашите експресни Js приложения. Както се казва в първия ред на Helmet npm docs
Helmet ви помага да защитите своите Express приложения, като зададете различни HTTP заглавки. Това не е сребърен куршум, но може да помогне!
Как работи?
Функцията helmet
от най-високо ниво е обвивка около 15 по-малки междинни програми, 11 от които са активирани по подразбиране.
15-те междинни софтуера включват -
- contentSecurityPolicy
- crossOriginEmbedderPolicy
- crossOriginOpenerPolicy
- crossOriginResourcePolicy
- очаквайте CT
- референтна политика
- hsts
- noSniff
- originAgentCluster
- dnsPrefetchControl
- ieNoOpen
- рамкова защита
- permittedCrossDomainPolicies
- hidePoweredBy
- 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());