𝗥𝗮𝗰𝗶𝗻𝗴 𝗮 𝗡𝗲𝘅𝘁.𝗷𝘀 𝗔𝗣𝗜 𝗥𝗼𝘂𝘁𝗲

ஒருமுறை மட்டுமே பயன்படுத்தக்கூடிய கூப்பன் (single-use coupon) ஒருமுறை மட்டுமே செயல்பட வேண்டும்.

ஆனால் இந்தச் சூழலில், முப்பது பேர் ஒரே நேரத்தில் இதைப் பயன்படுத்த முடியும்.

இது Time-of-Check Time-of-Use (TOCTOU) race condition காரணமாக நிகழ்கிறது.

இந்தத் தவறு இரண்டு நிலைகளில் நிகழ்கிறது:

  • நிலை 1: பயன்படுத்தப்பட்ட எண்ணிக்கையைச் சரிபார்க்க சர்வர் தரவுத்தளத்தை (database) வாசிக்கிறது.
  • நிலை 2: அந்த எண்ணிக்கையை அதிகரிக்க சர்வர் இரண்டாவது கட்டளையை அனுப்புகிறது.

நீங்கள் ஒரே நேரத்தில் பல கோரிக்கைகளை (requests) அனுப்பினால், இந்த இரண்டு நிலைகளுக்கு இடைப்பட்ட நேரத்தில் சர்வர் அவை அனைத்தையும் கையாளும்.

பல கோரிக்கைகள் எண்ணிக்கை இன்னும் பூஜ்ஜியமாக இருக்கும்போதே அதை வாசிக்கின்றன. அவை அனைத்தும் சரிபார்ப்பைத் தாண்டிவிடுகின்றன. அவை அனைத்தும் தள்ளுபடியைப் (discount) பயன்படுத்துகின்றன. அவை அனைத்தும் எண்ணிக்கையை அதிகரிக்கின்றன.

இதன் விளைவு? ஒரு நபருக்காக மட்டுமே உருவாக்கப்பட்ட கூப்பன் முப்பது முறை பயன்படுத்தப்படுகிறது.

குறியீடு ஆய்வின் (code review) போது இதை எளிதாகக் கவனிக்கத் தவறிவிடலாம். நீங்கள் வரி வரியாகப் படிக்கும்போது தர்க்கம் (logic) சரியாகத் தோன்றும். வேகம் மற்றும் ஒரே நேரத்தில் பல செயல்பாடுகள் நடக்கும்போது (concurrency) மட்டுமே இந்தத் தவறு வெளிப்படும்.

இதை எவ்வாறு சரிசெய்வது:

தனித்தனி read மற்றும் write கட்டளைகளைப் பயன்படுத்துவதை நிறுத்துங்கள். அதற்குப் பதிலாக, ஒரு ஒற்றை அணுக்கட்டளையை (atomic operation) பயன்படுத்துங்கள்.

Prisma-வில், WHERE clause-இல் ஒரு நிபந்தனையுடன் updateMany-ஐப் பயன்படுத்தலாம்:

• தரவுத்தளம் நிபந்தனையைச் சரிபார்த்து, ஒரே ஒரு செயல்பாட்டில் (single motion) புதுப்பிப்பைச் செய்கிறது. • எண்ணிக்கை ஏற்கனவே வரம்பிற்குச் சென்றிருந்தால், புதுப்பிப்பு உடனடியாகத் தோல்வியடையும். • சரிபார்ப்புக்கும் எழுதுதலுக்கும் (write) இடையில் வேறு எந்தக் கோரிக்கையும் நுழைய முடியாது.

மற்றொரு விருப்பம் database transaction பயன்படுத்துவதாகும். இது தரவை லாக் (lock) செய்கிறது, இதனால் நீங்கள் முடிக்கும் வரை வேறு எந்தக் கோரிக்கையும் அதைத் தொட முடியாது.

SQLite-க்கு, ஒற்றை update கட்டளையே மிகவும் நம்பகமான முறையாகும்.

எப்போதும் உங்களிடமே கேட்டுக்கொள்ளுங்கள்: ஒரே மில்லி விநாடியில் இரண்டு கோரிக்கைகள் இந்தத் தர்க்கத்தைத் தாக்கினால் என்ன நடக்கும்?

மூலம்: https://dev.to/oopssec-store/racing-a-nextjs-api-route-coupon-abuse-with-prisma-and-sqlite-3gma