Làm cách nào để bảo mật ứng dụng bằng Mũ bảo hiểm trong Node.js?

Lam Cach Nao De Bao Mat Ung Dung Bang Mu Bao Hiem Trong Node Js



Trang web hoạt động như một phương tiện giữa người dùng thời gian thực và chủ sở hữu trang web, chúng giúp cả hai bên đạt được mong muốn của mình giống như người bán hàng và khách hàng. Nhưng khi trang web nằm trên mạng, nhiều loại rủi ro bảo mật khác nhau có thể gây tổn hại đến tài sản của cả khách hàng và chủ sở hữu trang web. Điều này dẫn đến nhu cầu tăng cường bảo mật của trang web để những kẻ tấn công không thể phá vỡ nó.

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

Phần kết luận



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. js

Sau đó, 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ồm

Bả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ểm

Hì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ô. js

Hì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ụng

nú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ụng

nú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 tin

nú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ư “”, “”, “ ” và “