Node.js డెవలపర్లు ప్రొడక్షన్‌లోకి పంపే సెక్యూరిటీ బగ్స్

గత ఏడాది నేను ఒక స్టార్టప్ కోసం కోడ్‌ను రివ్యూ చేశాను. కోడ్ చాలా క్లీన్‌గా ఉంది. టెస్ట్‌లు కూడా పాస్ అయ్యాయి.

అప్పుడు నేను ఈ లైన్‌ను చూశాను: const query = SELECT * FROM users WHERE email = '${req.body.email}'``

ఇది ఒక SQL injection బగ్. ఆ స్టార్టప్ దీనిని 8 నెలల పాటు ప్రొడక్షన్‌లో నడిపింది. ఏ డెవలపర్ లేదా CTO కూడా దీనిని గుర్తించలేదు.

ఈ బగ్స్ కనిపించవు ఎందుకంటే కోడ్ సరిగ్గా పనిచేస్తుంది. ఒక యూజర్ ఇన్‌పుట్ ఫీల్డ్‌లో ఏదైనా హానికరమైన కమాండ్‌ను టైప్ చేసే వరకు ఇది ఎటువంటి ఇబ్బంది లేకుండా పనిచేస్తుంది.

ఈ 5 సాధారణ తప్పులను ఆపండి:

  1. యూజర్ ఇన్‌పుట్‌తో Raw SQL వాడటం క్వరీల కోసం template literals ఉపయోగించకండి. ఇది అటాకర్లు మీ డేటాబేస్‌ను యాక్సెస్ చేయడానికి అవకాశం ఇస్తుంది.
  • తప్పు: 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 ఫైళ్లను రిపోజిటరీలకు కమిట్ చేస్తారు. దీనివల్ల మీ డేటాబేస్ URLలు మరియు API కీలు బయటపడతాయి. ఎల్లప్పుడూ మీ .gitignore ఫైల్‌లో .envని చేర్చండి.

  2. jwt.verify కి బదులుగా jwt.decode వాడటం jwt.decode కేవలం టోకెన్‌ను మాత్రమే చదువుతుంది. ఆ టోకెన్ నిజమైనదా కాదా అని అది తనిఖీ చేయదు. ఎవరైనా డీకోడ్ చేసిన టోకెన్‌ను సృష్టించగలరు (forge చేయగలరు).

  • తప్పు: const user = jwt.decode(token)
  • మంచిది: ఎల్లప్పుడూ సిగ్నేచర్‌ను వెరిఫై చేయండి. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Auth endpoints లలో rate limiting లేకపోవడం Rate limiting లేకపోతే, అటాకర్లు brute force ద్వారా లక్షలాది పాస్‌వర్డ్‌లను ప్రయత్నించవచ్చు. లాగిన్ ప్రయత్నాలను పరిమితం చేయడానికి ఒక లైబ్రరీని ఉపయోగించండి.
  • మంచిది: ప్రతి 15 నిమిషాలకు 10 ప్రయత్నాల పరిమితిని విధించండి.
  1. వివరణాత్మకమైన (Verbose) ఎర్రర్ మెసేజ్‌లు క్లయింట్‌కు నేరుగా ఎర్రర్ మెసేజ్‌లను పంపడం వల్ల అటాకర్లు మీ సిస్టమ్‌ను సులభంగా అర్థం చేసుకుంటారు. వారు మీ టేబుల్ పేర్లు మరియు డేటాబేస్ రకాలను చూడగలుగుతారు.
  • తప్పు: res.status(500).json({ error: error.message })
  • మంచిది: ఎర్రర్‌ను అంతర్గతంగా (internally) లాగ్ చేయండి. యూజర్‌కు ఒక సాధారణ (generic) మెసేజ్‌ను పంపండి. 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