Hitilafu ya Kiungo cha Ufuatiliaji Inayoharibu Signed URLs

Hitilafu inaweza kuwa hatari ikiwa inaharibu tu vitu muhimu zaidi.

Niligundua hitilafu katika mail-history ambayo inafanya kazi vizuri kwa viungo vya kawaida lakini inafeli kwa signed URLs. Inaharibu viungo vya uhakiki wa barua pepe na viungo vya kupakua vilivyosainiwa. Hivi ni viungo ambapo herufi moja isiyo sahihi husababisha Laravel kukataa ombi.

Hivi ndivyo ilivyotokea.

mail-history hufuatilia bofyo za barua pepe kwa kuandika upya HTML yako. Inabadilisha kila kiungo ili kipite kwenye redirect endpoint kwanza. Endpoint hii hurodhi bofyo hiyo na kisha kumpeleka mtumiaji kwenye mwisho halisi.

Ili kufanya hivyo, mfumo hufanya encryption ya URL ya asili kuwa kiungo cha ufuatiliaji.

Tatizo huanza wakati mfumo unapoivuta URL kutoka kwenye HTML iliyochakatwa (rendered HTML). Wakati kodi inaposoma mwili wa barua pepe, Laravel tayari imeshatenganisha (escaped) HTML. Alama ya ampersand (&) kwenye kiungo inakuwa &.

Kiungo cha kawaida kama https://example.com/page kinafanya kazi vizuri. Hakina alama za ampersand.

Lakini signed URL inaonekana hivi: https://example.com/email/verify/1/abc?expires=123&signature=deadbeef

Katika HTML, inakuwa: https://example.com/email/verify/1/abc?expires=123&signature=deadbeef

Kodi hufanya encryption ya mfululizo huo wa &. Mtumiaji anapobofya, mfumo hufanya decryption na kumpeleka kwenye URL yenye &. Laravel inajaribu kuhakiki saini, lakini uhakiki unafeli kwa sababu herufi hazilingani na zile za asili.

Suluhisho ni mstari mmoja wa kodi. Lazima ufungue (decode) HTML entities kabla ya kufanya encryption ya URL.

$originalUrl = html_entity_decode($matches[2], ENT_QUOTES | ENT_HTML5);

Hii inarudisha & kuwa & kabla ya encryption kufanyika. Kiungo kilichofunguliwa (decrypted) sasa kinalingana na signed URL ya asili kwa kila byte.

Pia niliongeza jaribio (test) ili kuzuia hili lisitokee tena. Jaribio hilo linahakikisha kuwa URL iliyofunguliwa ina & halisi na si &.

Marekebisho madogo kama haya ni rahisi kupotea wakati wa usafishaji wa kodi (code cleanups) wa baadaye. Daima andika jaribio linalotaja hitilafu hiyo mahususi.

Mafunzo kwako:

  • Ikiwa unatoa data kutoka kwenye HTML iliyochakatwa, chukulia kuwa imeshatenganishwa (escaped).
  • Kivinjari (browser) kitarekebisha herufi zilizotenganishwa (escaped characters) kwa ajili yako. Encryption na redirects hazitafanya hivyo.
  • Tumia majaribio (tests) kulinda marekebisho ya mstari mmoja.

Chanzo: https://dev.to/nasrulhazim/the-tracking-link-bug-that-only-breaks-signed-urls-38c