1. Sở thích
1.1.Biến môi trường
Quản lý dữ liệu cấu hình (khóa API, thông tin đăng nhập cơ sở dữ liệu và thông tin nhạy cảm khác) bằng các biến môi trường giúp loại bỏ dữ liệu nhạy cảm khỏi cơ sở mã của bạn.
Sử dụng gói dotenv để tải các biến môi trường từ tệp .env
.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> dotenv |
Tạo tệp .env trong thư mục gốc của dự án và xác định các biến của bạn.
1 2 3 4 | API_KEY <span class="token operator">=</span> myapikey DB_USER <span class="token operator">=</span> mydbuser DB_PASSWORD <span class="token operator">=</span> mydbpassword |
Tải các biến trong ứng dụng Node.js của bạn.
1 2 3 4 | <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'dotenv'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">config</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">API_KEY</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// myapikey</span> |
Thêm tệp .env vào tệp .gitignore của bạn để ngăn không cho tệp được cam kết vào kho lưu trữ của bạn.
1.2. Tránh thông tin xác thực được mã hóa cứng
Mã hóa cứng thông tin đăng nhập và khóa API vào mã của bạn là một phương pháp không tốt làm ảnh hưởng đến tính bảo mật. Lưu trữ dữ liệu nhạy cảm trong các biến môi trường hoặc bộ nhớ ngoài an toàn.
Lưu trữ và quản lý bí mật ứng dụng một cách an toàn bằng giải pháp quản lý bí mật như HashiCorp Vault hoặc AWS Secrets Manager.
2. Giao tiếp an toàn
2.1. HTTPS và SSL/TLS
Bằng cách mã hóa thông tin liên lạc, bạn có thể bảo vệ thông tin nhạy cảm và duy trì quyền riêng tư của người dùng. Mã hóa giao tiếp giữa máy khách và ứng dụng Node.js bằng HTTPS và SSL/TLS.
Nhận chứng chỉ SSL từ Tổ chức phát hành chứng chỉ (CA) đáng tin cậy và định cấu hình ứng dụng Node.js của bạn để sử dụng HTTPS.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">const</span> https <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'https'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> fs <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'fs'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> options <span class="token operator">=</span> <span class="token punctuation">{</span> key <span class="token operator">:</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'server.key'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> cert <span class="token operator">:</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'server.cert'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> https <span class="token punctuation">.</span> <span class="token function">createServer</span> <span class="token punctuation">(</span> options <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">writeHead</span> <span class="token punctuation">(</span> <span class="token number">200</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> res <span class="token punctuation">.</span> <span class="token function">end</span> <span class="token punctuation">(</span> <span class="token string">'こんにちは、セキュアな世界!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
2.2. Tiêu đề bảo mật HTTP
Tiêu đề bảo mật HTTP giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công và lỗ hổng bảo mật khác nhau. Sử dụng phần mềm trung gian Mũ bảo hiểm để đặt tiêu đề bảo mật trong ứng dụng Node.js của bạn.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> helmet |
Sử dụng Mũ bảo hiểm trong ứng dụng Express của bạn.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> helmet <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'helmet'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">helmet</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'こんにちは、セキュアな世界!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'ポート3000でサーバーが稼働中'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Mũ bảo hiểm đặt các tiêu đề bảo mật khác nhau, chẳng hạn như Chính sách bảo mật nội dung, Tùy chọn loại nội dung X, Tùy chọn khung X và Bảo vệ X-XSS. Theo tùy chọn, bạn có thể tùy chỉnh các tiêu đề cho phù hợp với nhu cầu của ứng dụng.
3. Xác thực và ủy quyền
3.1. Mã thông báo web JSON (JWT)
Mã thông báo web JSON (JWT) cung cấp một cách an toàn và không trạng thái để xác thực và ủy quyền trong các ứng dụng Node.js. Tạo và xác thực JWT bằng gói jsonwebtoken.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> jsonwebtoken |
Tạo JWT bằng khóa riêng của bạn.
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> jwt <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'jsonwebtoken'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> payload <span class="token operator">=</span> <span class="token punctuation">{</span> userId <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> role <span class="token operator">:</span> <span class="token string">'admin'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> secretKey <span class="token operator">=</span> <span class="token string">'my-secret-key'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> token <span class="token operator">=</span> jwt <span class="token punctuation">.</span> <span class="token function">sign</span> <span class="token punctuation">(</span> payload <span class="token punctuation">,</span> secretKey <span class="token punctuation">,</span> <span class="token punctuation">{</span> expiresIn <span class="token operator">:</span> <span class="token string">'1h'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> token <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Xác thực JWT và giải mã tải trọng.
1 2 3 | <span class="token keyword">const</span> decoded <span class="token operator">=</span> jwt <span class="token punctuation">.</span> <span class="token function">verify</span> <span class="token punctuation">(</span> token <span class="token punctuation">,</span> secretKey <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> decoded <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tốt nhất là giữ khóa riêng an toàn và lưu trữ nó trong một biến môi trường hoặc giải pháp quản lý bí mật.
3.2.OAuth 2.0
OAuth 2.0 là một tiêu chuẩn được sử dụng rộng rãi để xác thực và ủy quyền, cho phép người dùng cấp cho các ứng dụng của bên thứ ba quyền truy cập vào tài nguyên. Xác thực người dùng bằng chiến lược phần mềm trung gian Passport.js và OAuth 2.0 (chẳng hạn như passport-google-oauth20).
1 2 | <span class="token function">npm</span> <span class="token function">install</span> passport passport-google-oauth20 |
Định cấu hình chiến lược Hộ chiếu và Google OAuth 2.0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">const</span> passport <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'passport'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> GoogleStrategy <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'passport-google-oauth20'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> Strategy <span class="token punctuation">;</span> passport <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">GoogleStrategy</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> clientID <span class="token operator">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">GOOGLE_CLIENT_ID</span> <span class="token punctuation">,</span> clientSecret <span class="token operator">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">GOOGLE_CLIENT_SECRET</span> <span class="token punctuation">,</span> callbackURL <span class="token operator">:</span> <span class="token string">'/auth/google/callback'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">accessToken <span class="token punctuation">,</span> refreshToken <span class="token punctuation">,</span> profile <span class="token punctuation">,</span> done</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// ユーザー情報をデータベースに保存するなどの処理を行います</span> <span class="token function">done</span> <span class="token punctuation">(</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> profile <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> passport <span class="token punctuation">.</span> <span class="token function">initialize</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/auth/google'</span> <span class="token punctuation">,</span> passport <span class="token punctuation">.</span> <span class="token function">authenticate</span> <span class="token punctuation">(</span> <span class="token string">'google'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> scope <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'profile'</span> <span class="token punctuation">,</span> <span class="token string">'email'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/auth/google/callback'</span> <span class="token punctuation">,</span> passport <span class="token punctuation">.</span> <span class="token function">authenticate</span> <span class="token punctuation">(</span> <span class="token string">'google'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> failureRedirect <span class="token operator">:</span> <span class="token string">'/login'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// 認証が成功したら、リダイレクト先を設定します</span> res <span class="token punctuation">.</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token string">'/dashboard'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Xác thực và làm sạch đầu vào
4.1. Xác thực đầu vào
Việc xác thực đầu vào của người dùng sẽ ngăn dữ liệu không hợp lệ được chuyển đến ứng dụng của bạn. Sử dụng thư viện xác thực như Joi hoặc Validator.js để xác thực đầu vào của bạn.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> joi |
Sử dụng Joi để xác thực dữ liệu đầu vào.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">const</span> Joi <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'joi'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> schema <span class="token operator">=</span> Joi <span class="token punctuation">.</span> <span class="token function">object</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> username <span class="token operator">:</span> Joi <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">alphanum</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">min</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">max</span> <span class="token punctuation">(</span> <span class="token number">30</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">required</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> password <span class="token operator">:</span> Joi <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pattern</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">RegExp</span> <span class="token punctuation">(</span> <span class="token string">'^[a-zA-Z0-9]{3,30}$'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">required</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> email <span class="token operator">:</span> Joi <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">email</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">required</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> validationResult <span class="token operator">=</span> schema <span class="token punctuation">.</span> <span class="token function">validate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> username <span class="token operator">:</span> <span class="token string">'user'</span> <span class="token punctuation">,</span> password <span class="token operator">:</span> <span class="token string">'password'</span> <span class="token punctuation">,</span> email <span class="token operator">:</span> <span class="token string">'email@example.com'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> validationResult <span class="token punctuation">.</span> error <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'入力検証エラー:'</span> <span class="token punctuation">,</span> validationResult <span class="token punctuation">.</span> error <span class="token punctuation">.</span> details <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'入力検証成功'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
4.2. Biện pháp đối phó SQL injection
Một cuộc tấn công SQL injection có thể xâm phạm dữ liệu của ứng dụng bằng cách đưa mã SQL độc hại vào đầu vào của người dùng. Ngăn chặn việc tiêm SQL trong các ứng dụng của bạn bằng cách sử dụng các truy vấn được tham số hóa và các câu lệnh đã chuẩn bị.
Ví dụ: bạn có thể sử dụng gói mysql2 để chạy các truy vấn được tham số hóa.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> mysql2 |
Tạo các truy vấn SQL an toàn bằng cách sử dụng trình giữ chỗ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">const</span> mysql <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'mysql2'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> connection <span class="token operator">=</span> mysql <span class="token punctuation">.</span> <span class="token function">createConnection</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> host <span class="token operator">:</span> <span class="token string">'localhost'</span> <span class="token punctuation">,</span> user <span class="token operator">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">DB_USER</span> <span class="token punctuation">,</span> password <span class="token operator">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">DB_PASSWORD</span> <span class="token punctuation">,</span> database <span class="token operator">:</span> <span class="token string">'mydb'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> userId <span class="token operator">=</span> <span class="token string">'1; DROP TABLE users;'</span> <span class="token punctuation">;</span> connection <span class="token punctuation">.</span> <span class="token function">query</span> <span class="token punctuation">(</span> <span class="token string">'SELECT * FROM users WHERE id = ?'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> userId <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">error <span class="token punctuation">,</span> results</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> error <span class="token punctuation">)</span> <span class="token keyword">throw</span> error <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> results <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> connection <span class="token punctuation">.</span> <span class="token function">end</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Bằng cách sử dụng trình giữ chỗ, các giá trị đầu vào được thoát đúng cách và ngăn chặn các cuộc tấn công SQL injection.
4.3. Các biện pháp đối phó với cross-site scripting (XSS)
Các cuộc tấn công cross-site scripting (XSS) có thể chèn các tập lệnh độc hại vào ứng dụng của bạn để ảnh hưởng đến những người dùng khác. Ngăn chặn các cuộc tấn công XSS bằng cách vệ sinh đầu vào của người dùng.
Sử dụng thư viện như DOMPurify hoặc xss để làm sạch đầu vào của người dùng.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> xss |
Vệ sinh dữ liệu đầu vào bằng thư viện xss.
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> xss <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'xss'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> userInput <span class="token operator">=</span> <span class="token string">'<script>alert("XSS攻撃!");</script>'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> sanitizedInput <span class="token operator">=</span> <span class="token function">xss</span> <span class="token punctuation">(</span> userInput <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> sanitizedInput <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// &lt;script&gt;alert("XSS攻撃!");&lt;/script&gt;</span> |
5. Quản lý các phụ thuộc
5.1. Cập nhật gói định kỳ
Các gói lỗi thời có thể gây ra các lỗ hổng bảo mật. Sử dụng npm-check-updates hoặc dependabot để cập nhật thường xuyên các phần phụ thuộc của bạn.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> -g npm-check-updates |
Sử dụng npm-check-updates để kiểm tra các gói cần cập nhật và cập nhật các gói.
1 2 3 | ncu <span class="token function">npm</span> update |
5.2. Quét lỗ hổng
Bạn có thể cải thiện bảo mật ứng dụng của mình bằng cách phát hiện và sửa các gói dễ bị tấn công. Quét các phần phụ thuộc và tìm lỗ hổng bằng kiểm toán npm hoặc Snyk.
Tìm và sửa các lỗ hổng với kiểm toán npm.
1 2 3 | <span class="token function">npm</span> audit <span class="token function">npm</span> audit fix |
6. Ghi nhật ký và giám sát
6.1. Thu thập và phân tích nhật ký
Việc thu thập và phân tích nhật ký là rất quan trọng để hiểu hành vi của ứng dụng và xác định các vấn đề cũng như vi phạm bảo mật. Thu thập nhật ký ứng dụng bằng thư viện ghi nhật ký như Winston hoặc Morgan.
1 2 | <span class="token function">npm</span> <span class="token function">install</span> winston morgan |
Sử dụng Winston và Morgan để thu thập nhật ký ứng dụng và xuất chúng thành một tệp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> winston <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'winston'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> morgan <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'morgan'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Morganを使用してHTTPリクエストログを出力します</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">morgan</span> <span class="token punctuation">(</span> <span class="token string">'combined'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Winstonを設定し、ファイルにログを出力します</span> <span class="token keyword">const</span> logger <span class="token operator">=</span> winston <span class="token punctuation">.</span> <span class="token function">createLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> level <span class="token operator">:</span> <span class="token string">'info'</span> <span class="token punctuation">,</span> format <span class="token operator">:</span> winston <span class="token punctuation">.</span> format <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> transports <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">winston <span class="token punctuation">.</span> transports <span class="token punctuation">.</span> File</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> filename <span class="token operator">:</span> <span class="token string">'logs/error.log'</span> <span class="token punctuation">,</span> level <span class="token operator">:</span> <span class="token string">'error'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">winston <span class="token punctuation">.</span> transports <span class="token punctuation">.</span> File</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> filename <span class="token operator">:</span> <span class="token string">'logs/combined.log'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// エラーハンドリングミドルウェアを定義します</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">err <span class="token punctuation">,</span> req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> logger <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> err <span class="token punctuation">.</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">500</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'何かが壊れました!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'ポート3000でサーバーが稼働中'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
6.2. Giám sát và Cảnh báo
Điều quan trọng là giám sát hiệu suất ứng dụng và các sự kiện bảo mật và nhận thông báo khi xảy ra sự cố. Theo dõi ứng dụng của bạn và đặt cảnh báo bằng Prometheus hoặc ELK stack (Elasticsearch, Logstash, Kibana).
Để đảm bảo tính bảo mật cho ứng dụng của bạn, hãy áp dụng các phương pháp hay nhất này, đồng thời thường xuyên đánh giá và cải thiện tính bảo mật của bạn.
7. Sao lưu và khắc phục thảm họa
7.1. Sao lưu dữ liệu
Dữ liệu ứng dụng là một tài sản quan trọng và việc mất dữ liệu có thể có tác động tiêu cực đáng kể đến doanh nghiệp của bạn. Thực hiện sao lưu dữ liệu thường xuyên để tránh mất dữ liệu. Định cấu hình và kiểm tra đúng chiến lược sao lưu cơ sở dữ liệu và lưu trữ tệp của bạn.
7.2. Kế hoạch khắc phục thảm họa
Kế hoạch khắc phục thảm họa là kế hoạch khôi phục nhanh chóng các hoạt động của ứng dụng trong trường hợp hệ thống bị lỗi hoặc mất dữ liệu. Một kế hoạch khắc phục thảm họa tốt có thể giúp giảm thiểu thời gian ngừng hoạt động.
- Xác định các thành phần và dữ liệu hệ thống quan trọng.
- Đặt mục tiêu thời gian khôi phục (RTO) và mục tiêu điểm khôi phục (RPO).
- Quy trình sao lưu và khôi phục tài liệu.
- Thường xuyên kiểm tra và cải thiện kế hoạch khắc phục thảm họa của bạn.
8. Giáo dục và Nhận thức về An ninh
8.1. Đào tạo bảo mật cho nhà phát triển
Để bảo mật ứng dụng, điều quan trọng là các nhà phát triển phải hiểu các rủi ro bảo mật và thực hiện các biện pháp thích hợp. Cung cấp đào tạo bảo mật thường xuyên và đảm bảo các nhà phát triển của bạn được cập nhật các lỗ hổng bảo mật mới nhất và các phương pháp hay nhất.
8.2. Chính sách và thủ tục bảo mật
Bằng cách xác định các chính sách và thủ tục bảo mật và thực thi chúng bởi các nhà phát triển và nhóm vận hành, bạn có thể quản lý các rủi ro bảo mật trong toàn tổ chức của mình. Ví dụ: nó có thể bao gồm chính sách mật khẩu, chính sách kiểm soát truy cập, quy trình xem xét mã, v.v.
bản tóm tắt
Trong bài viết này, chúng tôi đã đề cập đến các phương pháp hay nhất để chạy các ứng dụng Node.js một cách an toàn. Dưới đây là ý chính của nó.
- Sử dụng HTTPS để mã hóa thông tin liên lạc.
- Đặt tiêu đề bảo mật để ngăn chặn các cuộc tấn công phổ biến.
- Thực hiện đúng xác thực và ủy quyền và thiết lập kiểm soát truy cập.
- Xác thực và làm sạch đầu vào của người dùng để ngăn chặn các cuộc tấn công XSS và SQL injection.
- Thường xuyên cập nhật các phụ thuộc, quét và sửa các lỗ hổng.
- Thu thập nhật ký và thiết lập giám sát và cảnh báo để giúp xác định vấn đề nhanh chóng.
- Sao lưu dữ liệu của bạn và có kế hoạch khắc phục thảm họa để giúp bạn phục hồi nhanh chóng sau các lỗi hệ thống.
- Tiến hành đào tạo bảo mật cho các nhà phát triển và xác định các chính sách và quy trình bảo mật.
- Việc áp dụng những phương pháp hay nhất này có thể cải thiện tính bảo mật cho ứng dụng Node.js của bạn và ngăn không cho kẻ tấn công khai thác ứng dụng đó. Điều quan trọng là phải thường xuyên đánh giá bảo mật và cố gắng cải thiện.
cuối cùng
Tôi luôn mắc nợ. Tôi hy vọng bạn thích bài viết này và học được một cái gì đó mới.
Hẹn gặp lại các bạn trong bài viết tiếp theo! Nếu bạn thích bài viết này, hãy nhấn “THÍCH” và đăng ký để ủng hộ tôi. Cảm ơn rất nhiều.