Hành động có tác động mạnh mẽ nhất để tăng cường bảo mật trang web là định cấu hình các tiêu đề bảo mật HTTP có thể được thực hiện bằng cách sử dụng phần mềm trung gian cụ thể như mũ bảo hiểm.js.
Hướng dẫn này minh họa quy trình bảo mật ứng dụng node.js bằng mũ bảo hiểm.js bằng cách bao gồm các phần sau:
Làm cách nào để bảo mật ứng dụng bằng Mũ bảo hiểm trong Node.js?
Thiết lập ứng dụng Express mà không cần Mũ bảo hiểm.js
Bảo mật ứng dụng Express với Mũ bảo hiểm.js
Định cấu hình Tiêu đề bảo mật trong Mô-đun Mũ bảo hiểm.js
- Thiết lập tiêu đề Strict-Transport-Security
- Thiết lập tiêu đề Chính sách-Bảo mật-Nội dung
- Thiết lập tiêu đề chính sách giới thiệu
- Thiết lập tiêu đề X-Content-Type-Options
- Thiết lập tiêu đề X-Frame-Options
Làm cách nào để bảo mật ứng dụng bằng Mũ bảo hiểm trong Node.js?
Các ' Mũ bảo hiểm.js ” là mô-đun node.js được sử dụng làm phần mềm trung gian trong các ứng dụng express để bảo mật các tiêu đề trang web có thể bị tấn công. Bằng cách sử dụng mô-đun này, một lớp bảo mật bổ sung dưới dạng tiêu đề trang web sẽ được tạo ra, khiến việc khai thác các lỗ hổng phía máy khách như Cross-Site Scripting hoặc Clickjacking trở nên khó khăn hơn rất nhiều.
Trước tiên chúng ta hãy xem các phần bên dưới để hiểu rõ hơn về tầm quan trọng và cách hoạt động của mũ bảo hiểm.js trong node.js.
Thiết lập ứng dụng Express mà không cần Mũ bảo hiểm.js
Di chuyển vào ứng dụng node.js đã được tạo và tạo một “ .js ” gõ tệp có tên ngẫu nhiên là “ cron.js ' trong trường hợp của chúng ta. Sau đó, chèn các dòng mã dưới đây vào đó để thiết lập một ứng dụng express cơ bản:
hằng số expressObj = yêu cầu ( 'thể hiện' )hằng số cổng máy chủ = 3000
hằng số linuxhintApp = expressObj ( )
linuxhintApp. lấy ( '/' , ( yêu cầu, phản hồi ) => {
phản ứng. gửi ( 'Xin chào Linuxhint!' )
} )
linuxhintApp. Nghe ( cổng máy chủ, ( ) => {
bảng điều khiển. nhật ký ( `Ứng dụng đã tạo có thể được truy cập trên : http : //localhost:${serverPort}`)
} )
Trong đoạn mã trên:
- Đầu tiên, nhập “ thể hiện ” mô-đun sử dụng “ yêu cầu() ” và lưu trữ kết quả đầu ra trong “ expressObj ' Biến đổi. Sử dụng biến này một ứng dụng nhanh có tên “ linuxhintApp ” được tạo và số cổng của “ 3000 ” cũng được đặt trong một “ cổng máy chủ ' Biến đổi.
- Tiếp theo, đính kèm “ lấy() ” phương thức sử dụng “ phản ứng ” tham số gọi lại để hiển thị hoặc gửi văn bản giả qua phía người dùng thông qua “ gửi() ' phương pháp.
- Cuối cùng, tạo ra “ linuxhintApp ” được thực thi hoặc định cấu hình trên số cổng đã chỉ định bằng cách gọi “ Nghe() ' phương pháp.
Bây giờ, hãy chạy phần chứa “ cron.js ” bằng cách thực hiện lệnh được đề cập dưới đây:
nút cron. jsSau đó, mở “ Windows Powershell ” hoặc một cửa sổ terminal mới và thực hiện lệnh dưới đây để hiển thị ứng dụng đang chạy “ linuxhintApp tiêu đề:
Gọi - Yêu cầu web - kiểu < Url ứng dụng > - Bạn đang ở phân tích cơ bản | Lựa chọn - Sự vật - Tiêu đề thuộc tính mở rộngỨng dụng được tạo tùy chỉnh của chúng tôi đang chạy trên localhost với số cổng là “ 3000 ”. Vì vậy, lệnh trên sửa đổi theo điều kiện của chúng tôi như thế này:
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandPropertyẢnh gif bên dưới minh họa quá trình thực thi và tiêu đề trang web của ứng dụng cấp tốc đã tạo:
Nếu bạn là một “ Linux ” người dùng, sau đó thực hiện lệnh bên dưới để truy xuất các tiêu đề ứng dụng:
Xoăn < Url ứng dụng > -- bao gồmBảo mật ứng dụng Express với Mũ bảo hiểm.js
Các ' mũ bảo hiểm ” mô-đun bảo mật các tiêu đề ứng dụng cấp tốc để đảm bảo rằng dữ liệu không bị rò rỉ bởi các tiêu đề ứng dụng khi cuộc tấn công được phát động. Nhiều tiêu đề được chèn hoặc thêm bằng ứng dụng cấp tốc, giúp tiêu đề ứng dụng an toàn hơn và ít bị kẻ tấn công hơn. Cái này ' mũ bảo hiểm ” ứng dụng không được cài đặt theo mặc định, vì vậy nó cần được cài đặt cục bộ bằng cách thực hiện lệnh bên dưới:
npm tôi đội mũ bảo hiểmHình dưới đây cho thấy việc cài đặt “ mũ bảo hiểm mô-đun:
Bây giờ, mã trước đó của ứng dụng cấp tốc được sửa đổi như sau:
hằng số expressObj = yêu cầu ( 'thể hiện' )hằng số cổng máy chủ = 3000 ;
hằng số linuxhintApp = expressObj ( )
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;
linuxhintApp. sử dụng ( mũ bảo hiểmObj ( ) ) ;
linuxhintApp. lấy ( '/' , ( yêu cầu, phản hồi ) => {
phản ứng. gửi ( 'Xin chào Linuxhint!' )
} )
linuxhintApp. Nghe ( cổng máy chủ, ( ) => {
bảng điều khiển. nhật ký ( `Ứng dụng đã tạo có thể được truy cập trên : http : //localhost:${serverPort}`)
} )
Trong đoạn mã trên, cài đặt “ mũ bảo hiểm ” mô-đun được nhập và đối tượng của nó được lưu trữ trong “ mũ bảo hiểmObj ' Biến đổi. Biến này sau đó được chuyển dưới dạng phần mềm trung gian cho ứng dụng express bằng cách sử dụng express “ sử dụng() ”, phần còn lại của mã vẫn giữ nguyên.
Việc triển khai thực tế “ mũ bảo hiểm.js ” mô-đun trong ứng dụng express được hiển thị bên dưới:
Định cấu hình Tiêu đề bảo mật trong Mô-đun Mũ bảo hiểm.js
Rõ ràng từ kết quả đầu ra ở trên rằng “ mũ bảo hiểm.js ” mô-đun đặt nhiều tiêu đề theo mặc định để đạt được mức độ bảo mật tốt hơn cho ứng dụng. Tuy nhiên, những tiêu đề này có thể được cấu hình và đặt theo yêu cầu của chủ sở hữu ứng dụng. Các giá trị mặc định của tiêu đề này có thể được sửa đổi và chỉ một hoặc một số tiêu đề này có thể được áp dụng cho ứng dụng.
Mục đích và ý nghĩa của các tiêu đề này được minh họa ở dạng bảng dưới đây:
Tiêu đề bảo mật | Sự miêu tả |
Chính sách-Bảo mật-Nội dung | Các ' CSP ” thiết lập chính sách bảo mật để giảm thiểu các cuộc tấn công như tạo tập lệnh chéo trang và tiêm dữ liệu. Nó có giá trị mặc định là “ default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self'… ”. |
Chính sách mở nhiều nguồn gốc | Tiêu đề này chỉ định nguồn gốc của ứng dụng cấp tốc của bạn và nó được đặt thành “ cùng nguồn gốc ” theo mặc định. |
X-DNS-Kiểm soát tìm nạp trước: | Nó được sử dụng để kiểm soát các hoạt động tìm nạp DNS của trình duyệt hiện đang được sử dụng. |
X-Powered-By | Nó được sử dụng để loại bỏ thông tin được cung cấp bởi “ X_Powered-By ” vì nó làm rò rỉ thông tin về phiên bản ứng dụng và tên nhà cung cấp. |
Chính sách giới thiệu | Xác định xem có bất kỳ người giới thiệu nào của ứng dụng cấp tốc hay không. Nó có giá trị mặc định là “ không có người giới thiệu ”. |
Nghiêm ngặt-Giao thông-An ninh | Nó còn được gọi là “ HSTS ” và nó chỉ rõ rằng nội dung chỉ có thể được truy cập từ “ HTTPS ' hoặc ' HTTP ” trong trường hợp sử dụng “ tuổi tối đa ' Biến đổi. Nó có giá trị mặc định là “ tuổi tối đa=15552000; bao gồm các tên miền phụ ”. |
Tùy chọn loại nội dung X | Tiêu đề này đặc biệt đề cập đến việc ngăn chặn các cuộc tấn công đánh hơi và có giá trị mặc định là “ không ngửi được ”. |
Tùy chọn tải xuống X | Nó xử lý các tùy chọn tải xuống và đặt xem tệp đã tải xuống có được mở tự động hay không. Theo mặc định nó được đặt thành “ đừng mở ”. |
Tùy chọn khung X | Các ' Tùy chọn khung X ” chỉ định xem trình duyệt có cho phép hiển thị một trang web hay không. |
X-XSS-Bảo vệ | Nó bổ sung thêm một lớp bảo vệ khỏi các cuộc tấn công XSS. |
Bây giờ, hãy xem xét một số ví dụ để triển khai và đính kèm một tiêu đề duy nhất được chỉ định với ứng dụng express của chúng tôi.
Thiết lập tiêu đề Strict-Transport-Security
Tiêu đề này xử lý cấu hình vận chuyển tài nguyên ứng dụng bằng cách điều hướng trình duyệt để sử dụng HTTPS thay vì HTTP. Tiêu đề này cung cấp một tham số có tên là “ tuổi tối đa ” chứa các giây mà trình duyệt ghi nhớ sử dụng “HTTPS” làm tùy chọn.
Nó có giá trị mặc định là “ 15552000 ” tương đương với “180” ngày. Trong đoạn mã dưới đây, giá trị của “ tuổi tối đa ” sẽ được đặt trong 2 ngày hoặc “172800” giây, như hiển thị bên dưới:
hằng số expressObj = yêu cầu ( 'thể hiện' )hằng số cổng máy chủ = 3000 ;
hằng số linuxhintApp = expressObj ( )
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;
linuxhintApp. sử dụng ( mũ bảo hiểmObj. hsts ( {
tuổi tối đa : 172800 ,
} ) ) ;
linuxhintApp. lấy ( '/' , ( yêu cầu, phản hồi ) => {
phản ứng. gửi ( 'Xin chào Linuxhint!' )
} )
linuxhintApp. Nghe ( cổng máy chủ, ( ) => {
bảng điều khiển. nhật ký ( `Ứng dụng đã tạo có thể được truy cập trên : http : //localhost:${serverPort}`)
} )
Mã được hiển thị ở trên giống như đã được thảo luận ở phần trên. Chỉ ' hsts() ” phương thức được gắn vào “ mũ bảo hiểm.js ” đối tượng mô-đun. Phương thức “hsts()” xác định “ Nghiêm ngặt-Giao thông-An ninh ” tiêu đề và giá trị tính bằng giây mà trình duyệt có thể nhớ để ưu tiên cho trang “HTTPS” được gán cho “ tuổi tối đa ' tham số. Trong trường hợp của chúng tôi, giá trị được cung cấp tính bằng giây tương đương với “2” ngày.
Bây giờ, hãy thực hiện lệnh chứa “ ngô.js ” để phục vụ ứng dụng qua localhost bằng cách thực hiện lệnh bên dưới:
nút ngô. jsHình bên dưới cho thấy tệp đã được thực thi và ứng dụng được cung cấp tới một số cổng được chỉ định “ 3000 ” thành công:
Sau đó, thực hiện thao tác được đề cập dưới đây để lấy dữ liệu về các tiêu đề:
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandPropertyĐầu ra bên dưới cho thấy hiện tại chỉ áp dụng tiêu đề được chỉ định với giá trị do tùy chỉnh xác định:
Thiết lập tiêu đề Chính sách-Bảo mật-Nội dung
Các ' Chính sách-Bảo mật-Nội dung ” hoặc CSP cho phép bạn chỉ định tài nguyên trang web được phép tải và chạy. Bằng cách hạn chế tài nguyên của trang web, cơ hội tấn công dữ liệu thành công hoặc tấn công XSS sẽ giảm đi rất nhiều. Nó có giá trị mặc định là:
'Chính sách bảo mật nội dung: default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';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'Theo giá trị mặc định nêu trên của tiêu đề “CSP”, trang web không được phép tải hoặc chạy các kiểu, tập lệnh hoặc phông chữ từ xa. Để tùy chỉnh hành vi này, hãy sử dụng “ nội dungSecurityPolicy() ” và truyền các tài nguyên được phép dưới dạng tham số, như hiển thị bên dưới:
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;linuxhintApp. sử dụng ( mũ bảo hiểmObj. nội dungChính sách bảo mật ( {
mặc định sử dụng : ĐÚNG VẬY ,
chỉ thị : {
'phong cách' : 'in đậm' ,
} ,
} )
) ;
Trong khối mã trên:
- Các ' mặc định sử dụng ” với giá trị được đặt thành “ ĐÚNG VẬY ” được thông qua hiển thị các giá trị mặc định cho các tham số khác sẽ được sử dụng.
- Sau đó, bên trong “ chỉ thị ” phần các tài nguyên được phép có giá trị tùy chỉnh được chỉ định là “ phong cách ' trong trường hợp của chúng ta.
- Đoạn mã còn lại vẫn giữ nguyên như được mô tả ở phần trên.
Bây giờ, thực thi tệp chứa và truy xuất thông tin tiêu đề bằng cách thực hiện các lệnh bên dưới:
// để thực thi tệp hoặc phục vụ ứng dụngnút cron. js
// để truy xuất tiêu đề
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandProperty
Đầu ra cho thấy duy nhất “ mũ bảo hiểm.js ” tiêu đề đã được đính kèm cùng với các giá trị được phép tùy chỉnh và các thuộc tính còn lại được hiển thị không thay đổi:
Thiết lập tiêu đề chính sách giới thiệu
Các ' Tiêu đề chính sách giới thiệu ” xử lý dữ liệu được người giới thiệu gửi bất cứ khi nào người dùng nhấp vào liên kết trang web của bên thứ ba. Mặc dù, dữ liệu liên kết giới thiệu được truyền cho mục đích lưu vào bộ nhớ đệm hoặc phân tích, nhưng nếu dữ liệu liên kết giới thiệu này cũng chứa dữ liệu nhạy cảm có thể dẫn đến lỗ hổng bảo mật cho toàn bộ ứng dụng.
Các ' chính sách giới thiệu() ” phương thức do “helmet.js” cung cấp sẽ hạn chế hoặc chặn “ người giới thiệu ” chính sách ảnh hưởng đến quá trình lưu vào bộ nhớ đệm nhưng ngăn ngừa nguy cơ xảy ra các cuộc tấn công phi đạo đức. Hãy truy cập đoạn mã dưới đây để xem minh họa thực tế:
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;linuxhintApp. sử dụng ( mũ bảo hiểmObj. chính sách giới thiệu ( {
chính sách : 'không có người giới thiệu' ,
} )
) ;
Khối mã trên chỉ mô tả phần được sửa đổi, phần còn lại của mã vẫn giữ nguyên như mô tả ở các phần trên. Sau khi phân phối ứng dụng, hãy chạy lệnh tìm nạp dữ liệu tiêu đề để truy xuất dữ liệu về các tiêu đề đính kèm bằng cách thực hiện các lệnh bên dưới:
// để thực thi tệp hoặc phục vụ ứng dụngnút cron. js
// để truy xuất tiêu đề
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandProperty
Dữ liệu tiêu đề được truy xuất bên dưới cho thấy một “ Chính sách giới thiệu ” tiêu đề của mũ bảo hiểm.js được đính kèm và giá trị tùy chỉnh được gán cho nó:
Thiết lập tiêu đề X-Content-Type-Options
Tới mũ bảo hiểm.js “ Tùy chọn loại nội dung X ” tiêu đề được cấu hình và thiết lập cụ thể với ứng dụng chuyển phát nhanh được nhắm mục tiêu để ngăn chặn “ ClickJacking ” hoặc loại MIME “ Đánh hơi ”. Nó được thực hiện bằng cách áp dụng trực tiếp “ không đánh hơi() ” phương thức với “ mũ bảo hiểmObj ” biến, như hiển thị bên dưới:
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;linuxhintApp. sử dụng ( mũ bảo hiểmObjnoSniff ( ) ) ;
Sau khi sửa đổi được chỉ định, hãy thực thi tệp chứa và truy xuất thông tin tiêu đề bằng cách thực hiện các lệnh được đề cập:
// để thực thi tập tinnút cron. js
// để truy xuất tiêu đề
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandProperty
Các tiêu đề được truy xuất cho thấy tiêu đề mong muốn có giá trị được chỉ định đã được áp dụng cho ứng dụng express của chúng tôi:
Thiết lập tiêu đề X-Frame-Options
Tiêu đề HTTP X-Frame-Options cho phép hoặc ngăn trình duyệt hiển thị lại phần tử HTML như “”, “
Giá trị mặc định của tiêu đề “X-Frame-Options” được đặt thành “ CÙNG XUẤT XỨ ” cho phép trình duyệt nhúng các phần tử nếu yêu cầu được gửi từ cùng một nguồn. Tiêu đề này được đặt cụ thể từ “ khung bảo vệ() ”, như được hiển thị bên dưới:
hằng số mũ bảo hiểmObj = yêu cầu ( 'mũ bảo hiểm' ) ;linuxhintApp. sử dụng (
mũ bảo hiểmObj. người bảo vệ khung ( {
hoạt động : 'từ chối' ,
} )
) ;
Trong khối mã trên:
- mã đã sửa đổi sẽ được đặt bên trong mô-đun express “ sử dụng() ” phương thức được hiển thị.
- Bên trong phương thức này, “ khung bảo vệ() ” phương thức được gọi thông qua “ mũ bảo hiểmObj ” và thao tác dừng mọi thao tác nội dung nhúng được đặt. Bỏ qua tham số của “ hoạt động ” cùng với giá trị của nó là “ từ chối ”.
- Đoạn mã còn lại về việc gửi dữ liệu giả và phục vụ ứng dụng này trên localhost với số cổng “ 3000 ' vẫn như cũ.
Bây giờ, hãy thực hiện lệnh chứa “ cron.js ” tập tin qua:
nút cron. jsSau khi phân phát ứng dụng cục bộ, hãy truy xuất thông tin về các tiêu đề được chỉ định bằng cách chạy lệnh dưới đây:
Gọi - Yêu cầu web - Uri http : //localhost:3000/ -UseBasicParsing | Tiêu đề chọn đối tượng -ExpandPropertyKết quả đầu ra dưới đây cho thấy mục tiêu “ Tùy chọn khung X ” tiêu đề đã được đặt có giá trị được xác định tùy chỉnh:
Đó là tất cả về việc bảo mật các ứng dụng bằng mũ bảo hiểm trong node.js.
Phần kết luận
Mô-đun “helment.js” được sử dụng đặc biệt để bảo mật các Ứng dụng dựa trên express trong node.js. Nó được thêm vào thông qua “ sử dụng() ” làm phần mềm trung gian và theo mặc định áp dụng nhiều tiêu đề khác nhau cho ứng dụng để ngăn chặn rò rỉ bất kỳ dữ liệu nhạy cảm nào và các cuộc tấn công khác nhau. Những tiêu đề này cũng có thể được sửa đổi và chỉ những tiêu đề cụ thể mới có thể được đính kèm vào ứng dụng. Hướng dẫn này đã giải thích quy trình bảo mật các ứng dụng bằng mũ bảo hiểm trong node.js.