ಸೈನ್ಡ್ URLಗಳನ್ನು ಹಾಳುಮಾಡುವ ಟ್ರ್ಯಾಕಿಂಗ್-ಲಿಂಕ್ ಬಗ್
ಒಂದು ಬಗ್ ಅತ್ಯಂತ ಪ್ರಮುಖವಾದ ವಿಷಯಗಳನ್ನು ಮಾತ್ರ ಹಾಳುಮಾಡಿದರೆ ಅದು ಅಪಾಯಕಾರಿಯಾಗಬಹುದು.
ನಾನು mail-history ನಲ್ಲಿ ಒಂದು ಬಗ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದ್ದೇನೆ; ಇದು ಸಾಮಾನ್ಯ ಲಿಂಕ್ಗಳಿಗೆ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಆದರೆ ಸೈನ್ಡ್ URLಗಳಿಗೆ (signed URLs) ವಿಫಲವಾಗುತ್ತದೆ. ಇದು ಇಮೇಲ್ ವೆರಿಫಿಕೇಶನ್ ಲಿಂಕ್ಗಳು ಮತ್ತು ಸೈನ್ಡ್ ಡೌನ್ಲೋಡ್ ಲಿಂಕ್ಗಳನ್ನು ಹಾಳುಮಾಡುತ್ತದೆ. ಇವು ಅಂತಹ ಲಿಂಕ್ಗಳಾಗಿದ್ದು, ಇಲ್ಲಿ ಒಂದು ತಪ್ಪಾದ ಅಕ್ಷರವು Laravel ವಿನಂತಿಯನ್ನು (request) ತಿರಸ್ಕರಿಸುವಂತೆ ಮಾಡುತ್ತದೆ.
ಇದು ಹೇಗೆ ಸಂಭವಿಸಿತು ಎಂಬುದು ಇಲ್ಲಿದೆ.
mail-history ನಿಮ್ಮ HTML ಅನ್ನು ಮರುಬರೆಯುವ ಮೂಲಕ ಇಮೇಲ್ ಕ್ಲಿಕ್ಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುತ್ತದೆ. ಇದು ಪ್ರತಿಯೊಂದು ಲಿಂಕ್ ಅನ್ನು ಮೊದಲು ರಿಡೈರೆಕ್ಟ್ ಎಂಡ್ಪಾಯಿಂಟ್ (redirect endpoint) ಮೂಲಕ ಕಳುಹಿಸುವಂತೆ ಬದಲಾಯಿಸುತ್ತದೆ. ಈ ಎಂಡ್ಪಾಯಿಂಟ್ ಕ್ಲಿಕ್ ಅನ್ನು ದಾಖಲಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ ಬಳಕೆದಾರರನ್ನು ನಿಜವಾದ ಗಮ್ಯಸ್ಥಾನಕ್ಕೆ ಕಳುಹಿಸುತ್ತದೆ.
ಇದನ್ನು ಮಾಡಲು, ಸಿಸ್ಟಮ್ ಮೂಲ URL ಅನ್ನು ಟ್ರ್ಯಾಕಿಂಗ್ ಲಿಂಕ್ ಆಗಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ.
ಸಿಸ್ಟಮ್ ರೆಂಡರ್ ಮಾಡಲಾದ HTML ನಿಂದ URL ಅನ್ನು ಪಡೆಯುವಾಗ ಸಮಸ್ಯೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ. ಕೋಡ್ ಇಮೇಲ್ ಬಾಡಿಯನ್ನು ಓದುವಷ್ಟರಲ್ಲಿ, Laravel ಈಗಾಗಲೇ HTML ಅನ್ನು ಎಸ್ಕೇಪ್ (escape) ಮಾಡಿರುತ್ತದೆ. ಲಿಂಕ್ನಲ್ಲಿರುವ ಆಂಪರ್ಸ್ಯಾಂಡ್ (&) ಎಂಬುದು & ಆಗಿ ಬದಲಾಗುತ್ತದೆ.
https://example.com/page ನಂತಹ ಸಾಮಾನ್ಯ ಲಿಂಕ್ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಇದರಲ್ಲಿ ಆಂಪರ್ಸ್ಯಾಂಡ್ಗಳಿಲ್ಲ.
ಆದರೆ ಸೈನ್ಡ್ URL ಹೀಗೆ ಕಾಣುತ್ತದೆ: https://example.com/email/verify/1/abc?expires=123&signature=deadbeef
HTML ನಲ್ಲಿ, ಅದು ಹೀಗಾಗುತ್ತದೆ: https://example.com/email/verify/1/abc?expires=123&signature=deadbeef
ಕೋಡ್ ಆ & ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ. ಬಳಕೆದಾರರು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ಸಿಸ್ಟಮ್ ಅದನ್ನು ಡಿಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರನ್ನು & ಅನ್ನು ಒಳಗೊಂಡಿರುವ URL ಗೆ ಕಳುಹಿಸುತ್ತದೆ. Laravel ಸಹಿಯನ್ನು (signature) ಪರಿಶೀಲಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ, ಆದರೆ ಅಕ್ಷರಗಳು ಮೂಲದೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣ ಸಹಿ ವಿಫಲವಾಗುತ್ತದೆ.
ಇದಕ್ಕೆ ಪರಿಹಾರವು ಕೇವಲ ಒಂದು ಸಾಲಿನ ಕೋಡ್ ಆಗಿದೆ. ನೀವು URL ಅನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡುವ ಮೊದಲು HTML ಎಂಟಿಟಿಗಳನ್ನು (entities) ಡಿಕೋಡ್ ಮಾಡಬೇಕು.
$originalUrl = html_entity_decode($matches[2], ENT_QUOTES | ENT_HTML5);
ಇದು ಎನ್ಕ್ರಿಪ್ಶನ್ ಆಗುವ ಮೊದಲು & ಅನ್ನು ಮತ್ತೆ & ಆಗಿ ಬದಲಾಯಿಸುತ್ತದೆ. ಈಗ ಡಿಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ ಲಿಂಕ್ ಮೂಲ ಸೈನ್ಡ್ URL ನೊಂದಿಗೆ ಬೈಟ್-ಬೈಟ್ ಆಗಿ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ.
ಇದು ಮತ್ತೆ ಸಂಭವಿಸದಂತೆ ತಡೆಯಲು ನಾನು ಒಂದು ಟೆಸ್ಟ್ ಅನ್ನು ಸಹ ಸೇರಿಸಿದ್ದೇನೆ. ಡಿಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ URL ನಲ್ಲಿ & ಬದಲಿಗೆ ನಿಜವಾದ & ಇದೆಯೇ ಎಂದು ಈ ಟೆಸ್ಟ್ ಪರಿಶೀಲಿಸುತ್ತದೆ.
ಭವಿಷ್ಯದ ಕೋಡ್ ಕ್ಲೀನಪ್ಗಳ ಸಮಯದಲ್ಲಿ ಇಂತಹ ಸಣ್ಣ ಸರಿಪಡಿಸುವಿಕೆಗಳನ್ನು (fixes) ಮರೆತುಹೋಗುವುದು ಸುಲಭ. ಯಾವಾಗಲೂ ನಿರ್ದಿಷ್ಟ ವೈಫಲ್ಯವನ್ನು ಹೆಸರಿಸುವ ಟೆಸ್ಟ್ ಅನ್ನು ಬರೆಯಿರಿ.
ನಿಮಗಾಗಿ ಪಾಠಗಳು:
- ನೀವು ರೆಂಡರ್ ಮಾಡಲಾದ HTML ನಿಂದ ಡೇಟಾವನ್ನು ಹೊರತೆಗೆಯುತ್ತಿದ್ದರೆ, ಅದು ಎಸ್ಕೇಪ್ ಆಗಿದೆ ಎಂದು ಭಾವಿಸಿ.
- ಬ್ರೌಸರ್ ನಿಮ್ಮ ಪರವಾಗಿ ಎಸ್ಕೇಪ್ ಮಾಡಿದ ಅಕ್ಷರಗಳನ್ನು ಸರಿಪಡಿಸುತ್ತದೆ. ಎನ್ಕ್ರಿಪ್ಶನ್ ಮತ್ತು ರಿಡೈರೆಕ್ಟ್ಗಳು ಮಾಡುವುದಿಲ್ಲ.
- ಒಂದು ಸಾಲಿನ ಸರಿಪಡಿಸುವಿಕೆಗಳನ್ನು ರಕ್ಷಿಸಲು ಟೆಸ್ಟ್ಗಳನ್ನು ಬಳಸಿ.
ಮೂಲ: https://dev.to/nasrulhazim/the-tracking-link-bug-that-only-breaks-signed-urls-38c
