လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PDostatement :: Fetchall နှင့်အတူမေးမြန်းသောအခါ SQL ဆေးထိုးတိုက်ခိုက်မှုများကိုဘယ်လိုထိရောက်စွာတားဆီးမလဲ။

PDostatement :: Fetchall နှင့်အတူမေးမြန်းသောအခါ SQL ဆေးထိုးတိုက်ခိုက်မှုများကိုဘယ်လိုထိရောက်စွာတားဆီးမလဲ။

M66 2025-06-28

SQL Inject ဆိုတာဘာလဲ။

SQL Injection သည်ခိုးယူခြင်း, ဒေတာများနှင့်အတူခိုးယူခြင်း၏ရည်ရွယ်ချက်ကိုအောင်မြင်ရန်နှင့်ဒေတာဘေ့စ်ဆာဗာကိုပင်ထိန်းချုပ်ရန်အတွက်အန္တရာယ်ရှိသော SQL Code သို့ထည့်သွင်းသူအား SQL Code သို့ထည့်သွင်းရန် SQL Code သို့ထည့်သွင်းခြင်းအားရည်ညွှန်းသည်။ ဥပမာအားဖြင့်, developer တစ် ဦး သည်အသုံးပြုသူ input ကိုတိုက်ရိုက်ဖြည့်ဆည်းပေးနိုင်ပါကအသုံးပြုသူအား SQL query string တစ်ခုသို့တိုက်ရိုက်ဖြည့်ဆည်းပေးနိုင်ပါကတိုက်ခိုက်သူသည် query logic ကိုတိကျသော SQL Code ကိုပြောင်းလဲခြင်းဖြင့်ပြောင်းလဲနိုင်သည်။

ဥပမာအားဖြင့်, အောက်ပါစုံစမ်းမှုကြေညာချက်ရှိပါသည်ဆိုပါစို့:

 $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

အကယ်. တိုက်ခိုက်သူသည်အောက်ပါ username သို့မဟုတ် password အဖြစ်အောက်ပါသို့ဝင်ပါက -

  • အသုံးပြုသူအမည်: 'သို့မဟုတ်' 1 '=' 1 1

  • စကားဝှက်: 'သို့မဟုတ်' 1 '=' '1 1

ဒီစုံစမ်းမှုကြေညာချက်ဖြစ်လာသည်:

 SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';

၎င်းသည်ပုံမှန် authentication ကိုရှောင်ရှားပြီးတိုက်ခိုက်သူများသည်အထိခိုက်မခံသောအချက်အလက်များကိုအလွယ်တကူရယူနိုင်သည်။ ၎င်းကိုကာကွယ်ရန် SQL Injection Attack မှလျှောက်ထားခြင်းကိုကာကွယ်ရန် Parameterized Query (ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များ) ကိုသုံးနိုင်သည်။


PDO ကိုအသုံးပြုပြီး SQL ဆေးထိုးခြင်းကိုတားဆီးပါ

PDO သည် SQL Injection ကို ကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များကို ကာကွယ်ရန်အတွက်အားကောင်းသောယန္တရားကိုပေးသည်။ Preprocessing ထုတ်ပြန်ချက်များနှင့်ပြည့်စုံသော query in input ကို SQL Code ၏တစ်စိတ်တစ်ပိုင်းအနေဖြင့်အသုံးပြုသောအချက်အလက်များကို parameter အဖြစ်သတ်မှတ်သည်။

1 ။ PDO ကိုသုံးပြီးဒေတာဘေ့စ်ကိုဆက်သွယ်ပါ

ပထမ ဦး စွာ PDO ကိုသုံးပြီးဒေတာဘေ့စ်နှင့်ချိတ်ဆက်ရန်လိုအပ်သည်။ Debug အမှားများကိုပိုမိုကောင်းမွန်သော connection တစ်ခုဖန်တီးသောအခါခြွင်းချက်ကိုင်တွယ်မှုကိုသေချာအောင်လုပ်ပါ။

 try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "ဒေတာဘေ့စဆက်သွယ်မှုမအောင်မြင်ပါ: " . $e->getMessage();
}

2 ။ Preprocessing ထုတ်ပြန်ချက်များကိုအသုံးပြုပြီးမေးမြန်းခြင်း

PDO ၏ POSTOR ၏ကြိုတင်ထုတ်ပြန်ချက်များသည် SQL Injection ကိုတားဆီးရုံသာမကအထူးသဖြင့်အမျိုးအစားအလားတူမေးမြန်းချက်မျိုးစုံကိုကွပ်မျက်ခံရသည့်အခါစုံစမ်းမှုစွမ်းဆောင်ရည်ကိုလည်းတိုးတက်စေသည်။

အသုံးပြုသူအမည် အပေါ် အခြေခံ. အသုံးပြုသူအချက်အလက်များကိုပြန်လည်ရယူရန်လိုအပ်သည့်စုံစမ်းမှုတစ်ခုရှိသည်ဆိုပါစို့။ အောက်ပါကုဒ်ကိုသုံးနိုင်သည်။

 $sql = "SELECT * FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);

// parameters တွေကိုချည်ထား
$stmt->bindParam(':username', $username, PDO::PARAM_STR);

// တစ် ဦး စုံစမ်းမှု execute
$stmt->execute();

// စုံစမ်းမှုရလဒ်များကိုရယူပါ
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

// ရလဒ်ရလဒ်
foreach ($results as $row) {
    echo "အသုံးပြုသူ: " . $row['username'] . "<br>";
    echo "စာပို့: " . $row['email'] . "<br>";
}

အထက်ပါကုဒ်တွင် - သုံးစွဲသူအမည်သည် placeholder တစ်ခုဖြစ်ပြီးအသုံးပြုသူမှထည့်သွင်းထားသော Username သည် binparam method မှတဆင့် placeholder သို့ချည်နှောင်ထားလိမ့်မည်။ ဤနည်းလမ်းသည်အသုံးပြုသူမည်သည့်အရာ 0 င်သည်ဖြစ်စေ, SQL query ကိုထိထိရောက်ရောက်ကာကွယ်နိုင်ခြင်းကိုကာကွယ်ရန်အတွက် SQL query သို့တိုက်ရိုက်ခွဲခြားမယ့်အစားဒေတာဘေ့စ်အဖြစ်သတ်မှတ်ထားလိမ့်မည်။

3 ။ ရလဒ်များကိုရရန် fetchall ကိုသုံးပါ

PDostatement :: fetterall နည်းလမ်းသည် query ကိုအသစ်အဆန်းအဖြစ်ပြန်ပို့နိုင်သည်။ ၎င်းသည်အချက်အလက်အမျိုးမျိုးကိုရရန်အကောင်းဆုံးဖြစ်သည်။ အထက်ဖော်ပြပါကုဒ် နံပါတ် (PDO :: FETC_ACT_ANT_ACT_AT_AST_ALET_ALESOC) သည် quertive array တစ်ခု၏ပုံစံတစ်ခုစီ၏ပုံစံကိုပြန်ပို့ပေးလိမ့်မည်။

အကယ်. သင်သည်စုံစမ်းမှုရလဒ်အားလုံးကိုရလိုပါကအောက်ပါနည်းလမ်းကိုသုံးနိုင်သည်။

 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

အကယ်. သင်သည်တစ်ခုတည်းသောလိုင်းတစ်ခုတည်းကိုသာလိုအပ်ပါကသင် ရယူရန် နည်းလမ်းကိုသုံးနိုင်သည်။ အကယ်. သင်လိုင်းရလဒ်မျိုးစုံရလိုပါကရွေးချယ်မှုကောင်းတစ်ခုဖြစ်ပါတယ်။

4 ။ URL parameters တွေကိုသုံးတဲ့အခါမှတ်စုများ

သုံးစွဲသူထည့်သွင်းမှု, အထူးသဖြင့် URL parameters များကိုပြုပြင်သည့်အခါကြိုတင်အသုံးချထားသည့်ထုတ်ပြန်ချက်များကိုအမြဲတမ်းအသုံးပြုသင့်သည်။ ဥပမာအားဖြင့်, URL တွင် ID parameter တစ်ခုပါ 0 င်သည့်အခါ၎င်းသည် SQL ထုတ်ပြန်ချက်များသို့တိုက်ရိုက်ခွဲခြားခြင်းကိုရှောင်ရှားသင့်သည်။

ID parameter တစ်ခုသို့ URL သို့ကူးယူထားကြောင်းယူဆလျှင်လုံခြုံစိတ်ချရသောရှာဖွေမှုပြုလုပ်ရန်အောက်ပါကုဒ်ကိုသုံးနိုင်သည်။

 $id = $_GET['id'];  // ရယူ URL အိမ်တွင်း id တေးရေး

$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);

// parameters တွေကိုချည်ထား
$stmt->bindParam(':id', $id, PDO::PARAM_INT);

// တစ် ဦး စုံစမ်းမှု execute
$stmt->execute();

// စုံစမ်းမှုရလဒ်များကိုရယူပါ
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
  • သက်ဆိုင်သောတက်(ဂ်)များ:

    SQL