Node.js డెవలపర్లు ప్రొడక్షన్లోకి పంపే సెక్యూరిటీ బగ్స్
గత ఏడాది నేను ఒక స్టార్టప్ కోసం కోడ్ను రివ్యూ చేశాను. కోడ్ చాలా క్లీన్గా ఉంది. టెస్ట్లు కూడా పాస్ అయ్యాయి.
అప్పుడు నేను ఈ లైన్ను చూశాను:
const query = SELECT * FROM users WHERE email = '${req.body.email}'``
ఇది ఒక SQL injection బగ్. ఆ స్టార్టప్ దీనిని 8 నెలల పాటు ప్రొడక్షన్లో నడిపింది. ఏ డెవలపర్ లేదా CTO కూడా దీనిని గుర్తించలేదు.
ఈ బగ్స్ కనిపించవు ఎందుకంటే కోడ్ సరిగ్గా పనిచేస్తుంది. ఒక యూజర్ ఇన్పుట్ ఫీల్డ్లో ఏదైనా హానికరమైన కమాండ్ను టైప్ చేసే వరకు ఇది ఎటువంటి ఇబ్బంది లేకుండా పనిచేస్తుంది.
ఈ 5 సాధారణ తప్పులను ఆపండి:
- యూజర్ ఇన్పుట్తో 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])
Gitలో సీక్రెట్స్ను లీక్ చేయడం డెవలపర్లు తరచుగా
.envఫైళ్లను రిపోజిటరీలకు కమిట్ చేస్తారు. దీనివల్ల మీ డేటాబేస్ URLలు మరియు API కీలు బయటపడతాయి. ఎల్లప్పుడూ మీ.gitignoreఫైల్లో.envని చేర్చండి.jwt.verify కి బదులుగా jwt.decode వాడటం
jwt.decodeకేవలం టోకెన్ను మాత్రమే చదువుతుంది. ఆ టోకెన్ నిజమైనదా కాదా అని అది తనిఖీ చేయదు. ఎవరైనా డీకోడ్ చేసిన టోకెన్ను సృష్టించగలరు (forge చేయగలరు).
- తప్పు:
const user = jwt.decode(token) - మంచిది: ఎల్లప్పుడూ సిగ్నేచర్ను వెరిఫై చేయండి.
const user = jwt.verify(token, process.env.JWT_SECRET)
- Auth endpoints లలో rate limiting లేకపోవడం Rate limiting లేకపోతే, అటాకర్లు brute force ద్వారా లక్షలాది పాస్వర్డ్లను ప్రయత్నించవచ్చు. లాగిన్ ప్రయత్నాలను పరిమితం చేయడానికి ఒక లైబ్రరీని ఉపయోగించండి.
- మంచిది: ప్రతి 15 నిమిషాలకు 10 ప్రయత్నాల పరిమితిని విధించండి.
- వివరణాత్మకమైన (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
