SQL Injection
SQL Injection
SQL Injection သည် သင့်ဒေတာဘေ့စ်ကို ပျက်စီးစေမည့် ကုဒ်ထိုးခြင်းနည်းပညာတစ်ခုဖြစ်သည်။
SQL injection သည် အသုံးအများဆုံး web hacking နည်းပညာများထဲမှ တစ်ခုဖြစ်သည်။
SQL injection သည် ဝဘ်စာမျက်နှာထည့်သွင်းမှုမှတစ်ဆင့် SQL ထုတ်ပြန်ချက်များတွင် အန္တရာယ်ရှိသောကုဒ်များကို နေရာချထားခြင်းဖြစ်သည်။
ဝဘ်စာမျက်နှာများတွင် SQL
၎င်းတို့၏ username/userid ကဲ့သို့သော ထည့်သွင်းမှုအတွက် အသုံးပြုသူအား SQL injection သည် များသောအားဖြင့် ဖြစ်ပေါ်လေ့ရှိပြီး name/id အစား၊ အသုံးပြုသူက သင့်ဒေတာဘေ့စ်ပေါ်တွင် သင် မသိလိုက်ဘဲ လုပ်ဆောင်သွားမည့် SQL ကြေညာချက်ကို သင့်အား ပေးပါသည်။
SELECT
ရွေးချယ်ထားသော စာကြောင်းတစ်ခုသို့ ပြောင်းလဲနိုင်သော (txtUserId) ပေါင်းထည့်ခြင်းဖြင့် ဖော်ပြချက်ကို ဖန်တီးပေးသည့် အောက်ပါဥပမာကို ကြည့်ပါ ။ ကိန်းရှင်အား အသုံးပြုသူထည့်သွင်းမှု (getRequestString) မှ ရယူထားသည်-
ဥပမာ
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
ဤအခန်း၏ကျန်သည် SQL ကြေငြာချက်များတွင်အသုံးပြုသူထည့်သွင်းမှုကိုအသုံးပြုခြင်း၏အလားအလာအန္တရာယ်များကိုဖော်ပြသည်။
1=1 ကိုအခြေခံ၍ SQL Injection သည် အမြဲတမ်းမှန်ပါသည်။
အပေါ်က ဥပမာကို ပြန်ကြည့်ပါ။ ကုဒ်၏မူလရည်ရွယ်ချက်မှာ ပေးထားသောအသုံးပြုသူ ID ဖြင့် သုံးစွဲသူတစ်ဦးကို ရွေးချယ်ရန်အတွက် SQL ထုတ်ပြန်ချက်တစ်ခု ဖန်တီးရန်ဖြစ်သည်။
အသုံးပြုသူတစ်ဦး "မှားယွင်းသော" ထည့်သွင်းမှုကို တားဆီးရန် မည်သည့်အရာမျှ မရှိပါက၊ အသုံးပြုသူသည် ဤကဲ့သို့သော "စမတ်" ထည့်သွင်းမှုအချို့ကို ထည့်သွင်းနိုင်သည်-
သုံးစွဲသူအိုင်ဒီ:
ထို့နောက် SQL ကြေငြာချက်သည် ဤကဲ့သို့ဖြစ်နေလိမ့်မည်-
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
အထက်ဖော်ပြပါ SQL သည် မှန်ကန်ပြီး OR 1=1 သည် အမြဲမှန်ကန်သောကြောင့် "အသုံးပြုသူများ" ဇယားမှ အတန်းများအားလုံး ပြန်ပေးပါမည်။
အထက်ဖော်ပြပါ ဥပမာသည် အန္တရာယ်ရှိပုံပေါ်ပါသလား။ "အသုံးပြုသူများ" ဇယားတွင် အမည်များနှင့် စကားဝှက်များ ပါရှိနေပါက မည်သို့ဖြစ်မည်နည်း။
အထက်ဖော်ပြပါ SQL ထုတ်ပြန်ချက်သည် ဤကဲ့သို့ပင်ဖြစ်သည်
SELECT UserId, Name, Password
FROM Users WHERE UserId = 105 or 1=1;
ဟက်ကာတစ်ဦးသည် 105 OR 1=1 အား ထည့်သွင်းမှုအကွက်ထဲသို့ ရိုးရှင်းစွာထည့်သွင်းခြင်းဖြင့် ဒေတာဘေ့စ်တစ်ခုရှိ သုံးစွဲသူအမည်များနှင့် စကားဝှက်များအားလုံးကို ဝင်ရောက်ကြည့်ရှုနိုင်မည်ဖြစ်သည်။
""="" ကိုအခြေခံ၍ SQL Injection သည် အမြဲတမ်းမှန်ပါသည်။
ဤသည်မှာ ဝဘ်ဆိုက်တစ်ခုပေါ်ရှိ သုံးစွဲသူတစ်ဦး၏ အကောင့်ဝင်ခြင်း၏ ဥပမာတစ်ခုဖြစ်သည်။
အသုံးပြုသူအမည်-
စကားဝှက်-
ဥပမာ
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass +
'"'
ရလဒ်
SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"
ဟက်ကာတစ်ဦးသည် "OR ""=" အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက်စာသားအကွက်ထဲသို့ ရိုးရိုးရှင်းရှင်းထည့်သွင်းခြင်းဖြင့် ဒေတာဘေ့စ်တစ်ခုအတွင်းရှိ သုံးစွဲသူအမည်များနှင့် စကားဝှက်များကို ဝင်ရောက်ခွင့်ရရှိနိုင်သည်-
အသုံးပြုသူအမည်-
စကားဝှက်-
ဆာဗာရှိကုဒ်သည် ဤကဲ့သို့သော တရားဝင် SQL ထုတ်ပြန်ချက်ကို ဖန်တီးပေးလိမ့်မည်-
ရလဒ်
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
အထက်ဖော်ပြပါ SQL သည် တရား ဝင်ပြီး OR ""="" သည် အမြဲတမ်း အမှန်ဖြစ်သောကြောင့် "အသုံးပြုသူများ" ဇယားမှ အတန်းအားလုံးကို ပြန်ပေးပါမည်။
Batched SQL Statements များကို အခြေခံ၍ SQL Injection
ဒေတာဘေ့စ်အများစုသည် အတွဲလိုက် SQL ထုတ်ပြန်ချက်ကို ထောက်ခံသည်။
SQL ထုတ်ပြန်ချက်တစ်သုတ်သည် semicolons ဖြင့် ပိုင်းခြားထားသော SQL ဖော်ပြချက်နှစ်ခု သို့မဟုတ် ထို့ထက်ပိုသော အုပ်စုတစ်စုဖြစ်သည်။
အောက်ပါ SQL ကြေညာချက်သည် "အသုံးပြုသူများ" ဇယားမှ အတန်းအားလုံးကို ပြန်ပေးမည်ဖြစ်ပြီး၊ ထို့နောက် "ပေးသွင်းသူများ" ဇယားကို ဖျက်ပါမည်။
ဥပမာ
SELECT * FROM Users; DROP TABLE Suppliers
အောက်ပါဥပမာကိုကြည့်ပါ-
ဥပမာ
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
နှင့် အောက်ပါ ထည့်သွင်းမှု။
သုံးစွဲသူအိုင်ဒီ:
မှန်ကန်သော SQL ထုတ်ပြန်ချက်သည် ဤကဲ့သို့ ဖြစ်သည်-
ရလဒ်
SELECT * FROM Users WHERE
UserId = 105; DROP TABLE Suppliers;
ကာကွယ်မှုအတွက် SQL Parameters ကိုသုံးပါ။
ဝဘ်ဆိုက်တစ်ခုကို SQL ထိုးခြင်းမှ ကာကွယ်ရန်၊ သင်သည် SQL ဘောင်များကို အသုံးပြုနိုင်သည်။
SQL ကန့်သတ်ချက်များသည် ထိန်းချုပ်မှုပုံစံဖြင့် လုပ်ဆောင်သည့်အချိန်တွင် SQL query တစ်ခုသို့ ပေါင်းထည့်ထားသည့် တန်ဖိုးများဖြစ်သည်။
ASP.NET Razor ဥပမာ
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
ကန့်သတ်ချက်များကို @ အမှတ်အသားဖြင့် SQL ထုတ်ပြန်ချက်တွင် ကိုယ်စားပြုကြောင်း သတိပြုပါ။
SQL အင်ဂျင်သည် ၎င်း၏ကော်လံအတွက် မှန်ကန်ကြောင်း သေချာစေရန်နှင့် လုပ်ဆောင်ရမည့် SQL ၏ တစ်စိတ်တစ်ပိုင်းအဖြစ်မဟုတ်ဘဲ စာသားအတိုင်း ဆက်ဆံကြောင်း သေချာစေရန် SQL အင်ဂျင်သည် စစ်ဆေးပါသည်။
နောက်ဥပမာ
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
ဥပမာများ
အောက်ဖော်ပြပါနမူနာများသည် သာမန်ဝဘ်ဘာသာစကားအချို့တွင် ကန့်သတ်ချက်သတ်မှတ်ထားသော မေးခွန်းများကို မည်သို့တည်ဆောက်ရမည်ကို ပြသထားသည်။
ASP.NET တွင် ထုတ်ပြန်ချက်ကို ရွေးချယ်ပါ-
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
ASP.NET တွင် ထုတ်ပြန်ချက်ထဲသို့ ထည့်သွင်းပါ-
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
PHP တွင် ထုတ်ပြန်ချက်ထဲသို့ ထည့်သွင်းပါ-
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();