Signed URLs ను దెబ్బతీసే Tracking-Link బగ్

ఒక బగ్ మీ కోడ్‌లో చాలా కాలం పాటు దాగి ఉండవచ్చు. ఇది చాలా లింక్‌లకు సరిగ్గా పనిచేస్తుంది. మార్కెటింగ్ లింక్‌ల విషయంలో ఇది ఎటువంటి ఇబ్బంది లేకుండా ఉంటుంది. కానీ అత్యంత ముఖ్యమైన లింక్‌లను మాత్రం ఇది దెబ్బతీస్తుంది.

నా tool అయిన mail-historyలో నేను ఈ బగ్‌ను కనుగొన్నాను. ఇది signed URLs ను దెబ్బతీస్తుంది. ఇవి ఈమెయిల్ వెరిఫికేషన్ లేదా సురక్షితమైన డౌన్‌లోడ్‌ల కోసం ఉపయోగించే లింక్‌లు.

ఇది ఎలా జరిగిందంటే.

క్లిక్‌లను ట్రాక్ చేయడానికి నా tool ఈమెయిల్ HTMLని మారుస్తుంది (rewrites). ఇది అసలు URLని తీసుకుని, దానిని ఎన్‌క్రిప్ట్ చేసి, ఒక ట్రాకింగ్ లింక్‌గా మారుస్తుంది. వినియోగదారుడు క్లిక్ చేసినప్పుడు, tool ఆ URLని డీక్రిప్ట్ చేసి వారిని అసలు గమ్యస్థానానికి పంపిస్తుంది.

నేను rendered HTML నుండి URLని తీసుకున్నప్పుడు సమస్య మొదలైంది.

Laravel మరియు Blade HTML attributesలను escape చేస్తాయి. URLలోని ampersand (&) ఒక HTML entityగా మారుతుంది. అది & నుండి & గా మారుతుంది.

సాధారణ లింక్ విషయంలో, బ్రౌజర్ దీనిని ఆటోమేటిక్‌గా సరిచేస్తుంది. మీరు ఆ తేడాను గమనించలేరు.

కానీ నా tool ఆ లింక్‌ను బ్రౌజర్‌కు పంపదు. అది ఆ స్ట్రింగ్‌ను డీక్రిప్షన్ ఫంక్షన్‌కు పంపిస్తుంది.

మీ signed URL ఇలా ఉంటే: https://example.com/verify?expires=123&signature=abc

HTML ఇలా కనిపిస్తుంది: https://example.com/verify?expires=123&signature=abc

నా tool & ఉన్న వెర్షన్‌ను ఎన్‌క్రిప్ట్ చేస్తుంది. వినియోగదారుడు క్లిక్ చేసినప్పుడు, tool దానిని డీక్రిప్ట్ చేసి & ఉన్న వెర్షన్‌కే పంపిస్తుంది.

Laravel ఆ & ని చూసి signature తప్పుగా ఉందని భావిస్తుంది. దీనివల్ల వెరిఫికేషన్ ఫెయిల్ అవుతుంది.

దీనికి పరిష్కారం కేవలం ఒక లైన్ కోడ్ మాత్రమే. ఎన్‌క్రిప్షన్ జరగకముందే & ని తిరిగి & గా మార్చడానికి నేను html_entity_decodeని ఉపయోగిస్తాను.

దీనివల్ల డీక్రిప్ట్ చేయబడిన URL, అసలు signed URLతో బైట్ బైట్‌గా (byte for byte) సరిపోలుతుందని నిర్ధారించబడుతుంది.

మీ పని కోసం ఒక పాఠం:

  • మీరు ఒక ఫంక్షన్‌లో ఉపయోగించడానికి rendered HTML నుండి డేటాను తీసుకుంటే, అది escape చేయబడిందని భావించండి.
  • బ్రౌజర్‌లు తప్పులను క్షమిస్తాయి. కానీ ఎన్‌క్రిప్షన్ మరియు signature validation అలా చేయవు.
  • మీరు ఒక లైన్ కోడ్‌తో పరిష్కారం చూపిస్తే, దాని కోసం ఒక టెస్ట్ రాయండి.

నేను & ఉందో లేదో ప్రత్యేకంగా తనిఖీ చేసే ఒక టెస్ట్‌ను రాశాను. భవిష్యత్తులో ఏదైనా డెవలపర్ కోడ్ క్లీనప్ చేసేటప్పుడు నా పరిష్కారాన్ని తొలగిస్తే, ఆ టెస్ట్ వెంటనే ఫెయిల్ అవుతుంది.

మూలం: https://dev.to/nasrulhazim/the-tracking-link-bug-that-only-breaks-signed-urls-38c