Next.js API Route ನಲ್ಲಿ ರೇಸಿಂಗ್
ಒಂದು ಬಾರಿ ಮಾತ್ರ ಬಳಸಬಹುದಾದ ಕೂಪನ್ ಕೇವಲ ಒಂದು ಬಾರಿ ಮಾತ್ರ ಕೆಲಸ ಮಾಡಬೇಕು.
ಆದರೆ ಈ ಸಂದರ್ಭದಲ್ಲಿ, ಮೂವತ್ತು ಜನರು ಏಕಕಾಲದಲ್ಲಿ ಅದನ್ನು ಬಳಸಬಹುದು.
ಇದು Time-of-Check Time-of-Use (TOCTOU) race condition ನಿಂದಾಗಿ ಸಂಭವಿಸುತ್ತದೆ.
ಈ ದೋಷವು ಎರಡು ಹಂತಗಳಲ್ಲಿ ಸಂಭವಿಸುತ್ತದೆ:
- ಹಂತ 1: ಸರ್ವರ್ ಬಳಸಿದ ಸಂಖ್ಯೆಯನ್ನು (used count) ಪರಿಶೀಲಿಸಲು ಡೇಟಾಬೇಸ್ ಅನ್ನು ಓದುతుంది.
- ಹಂತ 2: ಸರ್ವರ್ ಆ ಸಂಖ್ಯೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ಎರಡನೇ ಕಮಾಂಡ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತದೆ.
ನೀವು ಏಕಕಾಲದಲ್ಲಿ ಅನೇಕ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಕಳುಹಿಸಿದರೆ, ಸರ್ವರ್ ಈ ಎರಡು ಹಂತಗಳ ಮಧ್ಯದಲ್ಲಿ ಅವೆಲ್ಲವನ್ನೂ ನಿರ್ವಹಿಸುತ್ತದೆ.
ಅನೇಕ ರಿಕ್ವೆಸ್ಟ್ಗಳು ಸಂಖ್ಯೆಯು ಇನ್ನೂ ಸೊನ್ನೆಯಾಗಿರುವಾಗಲೇ ಅದನ್ನು ಓದುತ್ತವೆ. ಅವೆಲ್ಲವೂ ಪರಿಶೀಲನೆಯನ್ನು ಪಾಸು ಮಾಡುತ್ತವೆ. ಅವೆಲ್ಲವೂ ರಿಯಾಯಿತಿಯನ್ನು ಅನ್ವಯಿಸುತ್ತವೆ. ಅವೆಲ್ಲವೂ ಕೌಂಟರ್ ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತವೆ.
ಇದರ ಪರಿಣಾಮವೇನು? ಒಬ್ಬ ವ್ಯಕ್ತಿಗೆ ಮಾತ್ರ ಮೀಸಲಾದ ಕೂಪನ್ ಅನ್ನು ಮೂವತ್ತು ಬಾರಿ ಬಳಸಲಾಗುತ್ತದೆ.
ಕೋಡ್ ರಿವ್ಯೂ ಮಾಡುವಾಗ ಇದನ್ನು ಗಮನಿಸುವುದು ಸುಲಭವಾಗಿ ತಪ್ಪಬಹುದು. ನೀವು ಇದನ್ನು ಸಾಲು ಸಾಲಾಗಿ ಓದಿದಾಗ ಲಾಜಿಕ್ ಪರಿಪೂರ್ಣವಾಗಿ ಕಾಣುತ್ತದೆ. ಆದರೆ ವೇಗ ಮತ್ತು concurrency ಅನ್ನು ಪರಿಗಣಿಸಿದಾಗ ಮಾತ್ರ ಈ ದೋಷವು ಎದುರಾಗುತ್ತದೆ.
ಇದನ್ನು ಸರಿಪಡಿಸುವುದು ಹೇಗೆ:
ಪ್ರತ್ಯೇಕ read ಮತ್ತು write ಕಮಾಂಡ್ಗಳನ್ನು ಬಳಸುವುದು ನಿಲ್ಲಿಸಿ. ಬದಲಾಗಿ, ಒಂದೇ atomic operation ಅನ್ನು ಬಳಸಿ.
Prisma ನಲ್ಲಿ, ನೀವು WHERE clause ನಲ್ಲಿ ಒಂದು ಕಂಡೀಶನ್ನೊಂದಿಗೆ updateMany ಅನ್ನು ಬಳಸಬಹುದು:
• ಡೇಟಾಬೇಸ್ ಕಂಡೀಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ ಮತ್ತು ಒಂದೇ ಹಂತದಲ್ಲಿ ಅಪ್ಡೇಟ್ ಅನ್ನು ಮಾಡುತ್ತದೆ. • ಒಂದು ವೇಳೆ ಸಂಖ್ಯೆಯು ಈಗಾಗಲೇ ಮಿತಿಯನ್ನು ತಲುಪಿದ್ದರೆ, ಅಪ್ಡೇಟ್ ತಕ್ಷಣವೇ ವಿಫಲವಾಗುತ್ತದೆ. • ಪರಿಶೀಲನೆ ಮತ್ತು ಬರವಣಿಗೆಯ ನಡುವೆ ಯಾವುದೇ ಇತರ ರಿಕ್ವೆಸ್ಟ್ ಮಧ್ಯಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
ಇನ್ನೊಂದು ಆಯ್ಕೆಯೆಂದರೆ ಡೇಟಾಬೇಸ್ transaction ಬಳಸುವುದು. ಇದು ಡೇಟಾವನ್ನು ಲಾಕ್ ಮಾಡುತ್ತದೆ, ಇದರಿಂದ ನೀವು ಕೆಲಸ ಮುಗಿಸುವವರೆಗೆ ಯಾವುದೇ ಇತರ ರಿಕ್ವೆಸ್ಟ್ ಅದನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
SQLite ಗೆ, ಒಂದೇ update ಕಮಾಂಡ್ ಅತ್ಯಂತ ವಿಶ್ವಾಸಾರ್ಹ ವಿಧಾನವಾಗಿದೆ.
ಯಾವಾಗಲೂ ನಿಮ್ಮನ್ನು ನೀವೇ ಕೇಳಿಕೊಳ್ಳಿ: ಎರಡು ರಿಕ್ವೆಸ್ಟ್ಗಳು ಒಂದೇ ಮಿಲಿಸೆಕೆಂಡ್ನಲ್ಲಿ ಈ ಲಾಜಿಕ್ಗೆ ಬಂದರೆ ಏನಾಗುತ್ತದೆ?
ಮೂಲ: https://dev.to/oopssec-store/racing-a-nextjs-api-route-coupon-abuse-with-prisma-and-sqlite-3gma