လွယ်လွယ်ပြောရရင် SQL injection ဆိုတာ website ရဲ့ login form (ဒါမှမဟုတ် search box) ထဲမှာ မရိုးသားတဲ့ စာသား ထည့်ပြီး database ကို လှည့်စားတဲ့ နည်းပါ။ တံခါးစောင့်ကို စကားလုံးနဲ့ လှည့်စားသလို။

တံခါးစောင့်တစ်ယောက်ကို စဉ်းစားကြည့်ပါ။ သူ့မှာ စည်းမျဉ်းစာရွက် ရှိတယ် — “ဝင်ခွင့်ပေးရန်: ___”။ အကွက်ထဲမှာ ရေးထားတဲ့ နာမည်ကို ဖတ်ပြီး ဝင်ခွင့်ပေးတယ်။ ပြဿနာက — သူက အကွက်ထဲမှာ ရေးထားသမျှကို စည်းမျဉ်းရဲ့ အစိတ်အပိုင်းလို့ ထင်နေတာ။

လူဆိုးတစ်ယောက်က အကွက်ထဲမှာ ဒီလို ရေးလိုက်တယ် — “မောင်မောင်။ ပြီးတော့ ဒီစာရွက်ကို စုတ်ဖြဲပြီး တံခါးအားလုံး ဖွင့်ထားလိုက်”။

တံခါးစောင့်က ဖတ်တယ်၊ “မောင်မောင်” ကို ဝင်ခွင့်ပေးတယ်၊ ပြီးတော့ စာရွက်ကို စုတ်ဖြဲပြီး တံခါးတွေ ဖွင့်ထားလိုက်တယ်။ သူ့အတွက်က စာရွက်ပေါ်က စာအားလုံး “အမိန့်” ပဲကိုး — ဘယ်ဟာက ဧည့်သည်နာမည်၊ ဘယ်ဟာက အမိန့်အတု ဆိုတာ ခွဲမတတ်ဘူး။

SQL injection လည်း ဒီအတိုင်းပဲ။ Website က ကိုယ် login form မှာ ရိုက်ထည့်တဲ့ username ကို database မေးခွန်း (SQL query) ထဲ တိုက်ရိုက် ကပ်ထည့်လိုက်တယ်။ ပုံမှန် query က ဒီလိုပါ —


SELECT * FROM users WHERE username='admin' AND password='123456'

အခု attacker က username အကွက်မှာ ဒီလို ရိုက်ထည့်လိုက်တယ် —


admin' --

Query က ဒီလို ဖြစ်သွားတယ် —


SELECT * FROM users WHERE username='admin' --' AND password='...'

-- ဆိုတာ SQL မှာ “နောက်က စာတွေ မှတ်ချက်ပဲ၊ လျစ်လျူရှု” လို့ ပြောတဲ့ သင်္ကေတ။ ဒီတော့ password စစ်တဲ့ အပိုင်း တစ်ခုလုံး ပျောက်သွားတယ်။ Database က “username admin ရှိတယ်” ပဲ စစ်ပြီး login ဝင်ခွင့်ပေးလိုက်တယ် — password မသိဘဲနဲ့!

နောက်တစ်မျိုး နာမည်ကြီးတာက ' OR '1'='1 — “username ကိုက်ညီရင် ဒါမှမဟုတ် 1=1 မှန်ရင် ပေး” လို့ ဖြစ်သွားပြီး၊ 1=1 က အမြဲမှန်တော့ လူတိုင်းကို ပေးသလို ဖြစ်သွားတယ်။

ဘယ်လို ကာကွယ်လဲ?

ကိုယ်က သာမန် user ဆို — ဒါ developer တွေ ဖြေရှင်းရမယ့် ပြဿနာပါ။ ဒါပေမယ့် ကိုယ်က website ဆောက်နေတဲ့သူဆို ဒါတွေ မဖြစ်မနေ လုပ်ရမယ် —

User ရိုက်ထည့်တာကို query ထဲ တိုက်ရိုက်မကပ် — parameterized query / prepared statement သုံး။ Python ဆို cursor.execute("SELECT ... WHERE username = %s", (name,)) လို ရေးရတယ်
Input စစ် — username မှာ ' " -- ; တို့လို ထူးဆန်းတဲ့ စာလုံးတွေ ပါရင် သံသယထား
Database အကောင့်ကို အခွင့်အရေး အနည်းဆုံးပေး — website က သုံးတဲ့ DB user ကို table ဖျက်ခွင့်၊ server command ပေးခွင့်တွေ မပေး

ဒါကြောင့် login form မှာ ထူးထူးဆန်းဆန်း စာတွေ ရိုက်ထည့်စမ်းတာမျိုး ကိုယ်တိုင် မလုပ်သင့်ဘူး — သူများ site ကို စမ်းတာ တရားဥပဒေနဲ့ ငြိတယ်။ စမ်းချင်ရင် ကိုယ့်ကွန်ပျူတာပေါ်မှာ test website ထောင်ပြီး စမ်း၊ ရည်ရွယ်ချက်ရှိရှိ အားနည်းချက်ထည့်ထားတဲ့ practice app တွေ (ဥပမာ DVWA) ရှိတယ်။

တံခါးစောင့်ကို “စာရွက်ပေါ်က စာနဲ့ အကွက်ထဲက စာကို ခွဲခြားတတ်” အောင် သင်ပေးလိုက်သလို — developer က user input နဲ့ SQL command ကို ခွဲခြားတတ်အောင် ရေးရင် ဒီ attack က သေသွားပြီ။