SQL ကျူတိုရီရယ်

SQL ပင်မစာမျက်နှာ SQL မိတ်ဆက် SQL Syntax SQL ကို ရွေးပါ။ SQL Distinct ကို ရွေးချယ်ပါ။ SQL ဘယ်မှာလဲ။ SQL And, Or, Not SQL Order By SQL Insert Into SQL Null တန်ဖိုးများ SQL အပ်ဒိတ် SQL ကိုဖျက်ပါ။ SQL သည် Top ကိုရွေးချယ်ပါ။ SQL Min နှင့် Max SQL အရေအတွက်၊ Avg၊ အစု SQL ကြိုက်တယ်။ SQL သင်္ကေတများ SQL In SQL အကြား SQL နာမည်များ SQL ချိတ်ဆက်မှု SQL Inner Join SQL Left Join SQL Right Join SQL အပြည့်အစုံ Join SQL Self Join SQL Union SQL Group By SQL ရှိခြင်း။ SQL ရှိတယ်။ SQL Any, All SQL Into ကိုရွေးချယ်ပါ။ SQL Insert Into Select လုပ်ပါ။ SQL Case SQL Null လုပ်ဆောင်ချက်များ SQL Stored လုပ်ထုံးလုပ်နည်းများ SQL မှတ်ချက်များ SQL အော်ပရေတာများ

SQL ဒေတာဘေ့စ်

SQL သည် DB ကိုဖန်တီးပါ။ SQL Drop DB SQL Backup DB SQL ဇယားဖန်တီးပါ။ SQL Drop Table SQL Alter Table SQL ကန့်သတ်ချက်များ SQL သည် Null မဟုတ်ပေ။ SQL သီးသန့် SQL Primary Key SQL Foreign Key SQL စစ်ဆေးခြင်း။ SQL မူရင်း SQL အညွှန်း SQL အလိုအလျောက်တိုး SQL ရက်စွဲများ SQL မြင်ကွင်းများ SQL Injection SQL Hosting SQL Data အမျိုးအစားများ

SQL ကိုးကားချက်များ

SQL သော့ချက်စာလုံးများ MySQL လုပ်ဆောင်ချက်များ SQL Server လုပ်ဆောင်ချက်များ MS Access Functions SQL အမြန် Ref

SQL နမူနာများ

SQL နမူနာများ SQL Quiz SQL လေ့ကျင့်ခန်းများ SQL လက်မှတ်

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();