Node.js ಡೆವಲಪರ್ಗಳು ಪ್ರೊಡಕ್ಷನ್ಗೆ ಕಳುಹಿಸುವ ಭದ್ರತಾ ದೋಷಗಳು
ಕಳೆದ ವರ್ಷ ನಾನು ಒಂದು ಸ್ಟಾರ್ಟ್ಅಪ್ನ ಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿದೆ. ಕೋಡ್ ನೋಡಲು ಸ್ವಚ್ಛವಾಗಿತ್ತು. ಟೆಸ್ಟ್ಗಳು ಕೂಡ ಯಶಸ್ವಿಯಾಗಿದ್ದವು.
ನಂತರ ನಾನು ಈ ಸಾಲನ್ನು ನೋಡಿದೆ:
const query = \SELECT * FROM users WHERE email = '${req.body.email}'``
ಇದು ಒಂದು SQL injection ದೋಷವಾಗಿದೆ. ಆ ಸ್ಟಾರ್ಟ್ಅಪ್ ಇದನ್ನು 8 ತಿಂಗಳುಗಳ ಕಾಲ ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ ಬಳಸುತ್ತಿತ್ತು. ಯಾವುದೇ ಡೆವಲಪರ್ ಅಥವಾ CTO ಇದನ್ನು ಗಮನಿಸಲಿಲ್ಲ.
ಈ ದೋಷಗಳು ಕಣ್ಣಿಗೆ ಕಾಣಿಸುವುದಿಲ್ಲ ಏಕೆಂದರೆ ಕೋಡ್ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಬಳಕೆದಾರರು ಇನ್ಪುಟ್ ಫೀಲ್ಡ್ನಲ್ಲಿ ತೊಂದರೆ ಕೊಡುವ (malicious) ಕಮಾಂಡ್ ಅನ್ನು ಟೈಪ್ ಮಾಡುವವರೆಗೆ ಇದು ಸುಗಮವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ.
ಈ 5 ಸಾಮಾನ್ಯ ತಪ್ಪುಗಳನ್ನು ಮಾಡಬೇಡಿ:
- ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ನೊಂದಿಗೆ Raw SQL ಬಳಸುವುದು ಕ್ವೇರಿಗಳಿಗಾಗಿ template literals ಬಳಸಬೇಡಿ. ಇದು ದಾಳಿಗಾರರು (attackers) ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ಗೆ ಪ್ರವೇಶಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ.
- ಕೆಟ್ಟದ್ದು:
const query = \SELECT * FROM users WHERE email = '${email}'`` - ಒಳ್ಳೆಯದು: Parameterized queries ಬಳಸಿ.
const query = 'SELECT * FROM users WHERE email = $1'db.query(query, [email])
Git ನಲ್ಲಿ ರಹಸ್ಯಗಳನ್ನು ಸೋರಿಕೆ ಮಾಡುವುದು ಡೆವಲಪರ್ಗಳು ಹೆಚ್ಚಾಗಿ
.envಫೈಲ್ಗಳನ್ನು ರೆಪೊಸಿಟರಿಗಳಿಗೆ ಕಮಿಟ್ ಮಾಡುತ್ತಾರೆ. ಇದು ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ URLಗಳು ಮತ್ತು API ಕೀಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಮ್ಮ.gitignoreಫೈಲ್ಗೆ.envಅನ್ನು ಸೇರಿಸಿ.jwt.verify ಬದಲಿಗೆ jwt.decode ಬಳಸುವುದು
jwt.decodeಕೇವಲ ಟೋಕನ್ ಅನ್ನು ಓದುತ್ತದೆ. ಅದು ಟೋಕನ್ ನಿಜವಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುವುದಿಲ್ಲ. ಯಾರೇ ಆದರೂ ಡಿಕೋಡ್ ಮಾಡಿದ ಟೋಕನ್ ಅನ್ನು ನಕಲಿ ಮಾಡಬಹುದು (forge).
- ಕೆಟ್ಟದ್ದು:
const user = jwt.decode(token) - ಒಳ್ಳೆಯದು: ಯಾವಾಗಲೂ signature ಅನ್ನು ಪರಿಶೀಲಿಸಿ.
const user = jwt.verify(token, process.env.JWT_SECRET)
- Auth endpoints ನಲ್ಲಿ rate limiting ಇಲ್ಲದಿರುವುದು Rate limiting ಇಲ್ಲದಿದ್ದರೆ, ದಾಳಿಗಾರರು brute force ಮೂಲಕ ಲಕ್ಷಾಂತರ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪ್ರಯತ್ನಿಸಬಹುದು. ಲಾಗಿನ್ ಪ್ರಯತ್ನಗಳನ್ನು ಮಿತಿಗೊಳಿಸಲು ಒಂದು ಲೈಬ್ರರಿಯನ್ನು ಬಳಸಿ.
- ಒಳ್ಳೆಯದು: ಪ್ರತಿ 15 ನಿಮಿಷಕ್ಕೆ 10 ಪ್ರಯತ್ನಗಳ ಮಿತಿಯನ್ನು ಸೇರಿಸಿ.
- ವಿವರವಾದ (Verbose) ಎರರ್ ಮೆಸೇಜ್ಗಳು ಕ್ಲೈಂಟ್ಗೆ ನೇರವಾದ (raw) ಎರರ್ ಮೆಸೇಜ್ಗಳನ್ನು ಕಳುಹಿಸುವುದು ದಾಳಿಗಾರರಿಗೆ ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಅವರು ನಿಮ್ಮ ಟೇಬಲ್ ಹೆಸರುಗಳು ಮತ್ತು ಡೇಟಾಬೇಸ್ ಪ್ರಕಾರಗಳನ್ನು ನೋಡಬಹುದು.
- ಕೆಟ್ಟದ್ದು:
res.status(500).json({ error: error.message }) - ಒಳ್ಳೆಯದು: ಎರರ್ ಅನ್ನು ಆಂತರಿಕವಾಗಿ (internally) ಲಾಗ್ ಮಾಡಿ. ಬಳಕೆದಾರರಿಗೆ ಸಾಮಾನ್ಯ ಸಂದೇಶವನ್ನು (generic message) ಕಳುಹಿಸಿ.
res.status(500).json({ error: 'Something went wrong' })
ನೀವು ಎಂಡ್ಪಾಯಿಂಟ್ ಅನ್ನು ಶಿಪ್ ಮಾಡುವ ಮೊದಲು, ಒಂದು ಪ್ರಶ್ನೆಯನ್ನು ಕೇಳಿ: ಬಳಕೆದಾರರು ಅನಿರೀಕ್ಷಿತ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿದರೆ ಏನಾಗುತ್ತದೆ?
ಭದ್ರತಾ ದೋಷಗಳು ಅಪರೂಪವಾಗಿ ಸಂಕೀರ್ಣವಾಗಿರುತ್ತವೆ. ನೀವು ಕೆಟ್ಟ ಉದ್ದೇಶ ಹೊಂದಿರುವವರ (bad actors) ಬಗ್ಗೆ ಯೋಚಿಸಲು ಮರೆತಾಗ ಇವು ಸಂಭವಿಸುತ್ತವೆ.
ನೀವು ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ ಯಾವ ಭದ್ರತಾ ದೋಷವನ್ನು ಕಂಡಿದ್ದೀರಿ?
Source: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6
