Node.js டெவலப்பர்கள் Production-க்கு கொண்டு செல்லும் பாதுகாப்புப் பிழைகள்

கடந்த ஆண்டு ஒரு ஸ்டார்ட்அப் நிறுவனத்தின் குறியீட்டை (code) நான் ஆய்வு செய்தேன். அந்த குறியீடு சுத்தமாகத் தெரிந்தது. சோதனைகளும் (tests) வெற்றிகரமாக முடிந்தன.

பிறகு நான் இந்த வரியைப் பார்த்தேன்: const query = SELECT * FROM users WHERE email = '${req.body.email}'``

இது ஒரு SQL injection பிழை. அந்த ஸ்டார்ட்அப் நிறுவனம் இதை 8 மாதங்களாக production-இல் இயக்கி வந்தது. எந்த டெவலப்பரோ அல்லது CTO-வோ இதைக் கண்டறியவில்லை.

இந்த பிழைகள் கண்ணுக்குத் தெரியாதவை, ஏனெனில் குறியீடு சரியாக வேலை செய்கிறது. ஒரு பயனர் உள்ளீட்டுப் புலத்தில் (input field) ஒரு தீய கட்டளையைத் தட்டச்சு செய்யும் வரை இது சரியாகவே இயங்கும்.

இந்த 5 பொதுவான தவறுகளைத் தவிர்க்கவும்:

  1. பயனர் உள்ளீட்டுடன் கூடிய Raw SQL வினவல்களுக்கு (queries) template literals-ஐப் பயன்படுத்த வேண்டாம். இது தாக்குபவர்கள் உங்கள் தரவுத்தளத்தை (database) அணுக வழிவகுக்கும்.
  • தவறு: const query = SELECT * FROM users WHERE email = '${email}'``
  • சரி: Parameterized queries-ஐப் பயன்படுத்தவும். const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Git-இல் ரகசியங்களை கசியவிடுதல் டெவலப்பர்கள் பெரும்பாலும் .env கோப்புகளைத் தங்கள் களஞ்சியங்களில் (repositories) commit செய்கிறார்கள். இது உங்கள் database URLs மற்றும் API keys-களை வெளிச்சத்திற்கு கொண்டு வரும். எப்போதும் உங்கள் .gitignore கோப்பில் .env-ஐச் சேர்க்கவும்.

  2. jwt.verify-க்கு பதிலாக jwt.decode-ஐப் பயன்படுத்துதல் jwt.decode டோக்கனைப் படிக்க மட்டுமே செய்யும். அந்த டோக்கன் உண்மையானதா என்பதை அது சரிபார்க்காது. யாராலும் ஒரு போலி டோக்கனை உருவாக்க முடியும்.

  • தவறு: const user = jwt.decode(token)
  • சரி: எப்போதும் கையொப்பத்தைச் (signature) சரிபார்க்கவும். const user = jwt.verify(token, process.env.JWT_SECRET)
  1. auth endpoints-களில் rate limiting இல்லாமை Rate limiting இல்லையென்றால், தாக்குபவர்கள் brute force மூலம் மில்லியன் கணக்கான கடவுச்சொற்களை முயற்சிக்க முடியும். லாகின் முயற்சிகளைக் கட்டுப்படுத்த ஒரு library-ஐப் பயன்படுத்தவும்.
  • சரி: 15 நிமிடங்களுக்கு 10 முயற்சிகள் என்ற அளவில் வரம்பை நிர்ணயிக்கவும்.
  1. விரிவான பிழைச் செய்திகள் (Verbose error messages) கிளையண்டிற்கு (client) நேரடி பிழைச் செய்திகளை அனுப்புவது, தாக்குபவர்கள் உங்கள் அமைப்பை (system) புரிந்துகொள்ள உதவும். அவர்கள் உங்கள் அட்டவணைப் பெயர்களையும் (table names) தரவுத்தள வகைகளையும் பார்த்துவிடுவார்கள்.
  • தவறு: res.status(500).json({ error: error.message })
  • சரி: பிழையை உள்நாட்டிலேயே (internally) பதிவு செய்யவும் (log). பயனருக்கு ஒரு பொதுவான செய்தியை மட்டும் அனுப்பவும். res.status(500).json({ error: 'Something went wrong' })

ஒரு endpoint-ஐ வெளியிடுவதற்கு முன், இந்த ஒரு கேள்வியைக் கேளுங்கள்: ஒரு பயனர் எதிர்பாராத தரவை அனுப்பினால் என்ன நடக்கும்?

பாதுகாப்புப் பிழைகள் அரிதாகவே சிக்கலானவை. தீய எண்ணம் கொண்டவர்கள் (bad actors) பற்றிச் சிந்திக்க நீங்கள் மறக்கும்போது அவை நிகழ்கின்றன.

நீங்கள் production-இல் கண்டறிந்த பாதுகாப்புப் பிழை எது?

Source: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6