လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PDostatement :: SQL Injection ကိုကာကွယ်ရန် Fetchobject နှင့် DetComPart နှင့် Fetchobject နှင့်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များ

PDostatement :: SQL Injection ကိုကာကွယ်ရန် Fetchobject နှင့် DetComPart နှင့် Fetchobject နှင့်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များ

gitbox 2025-05-29

ခေတ်သစ် PHP ဖွံ့ဖြိုးတိုးတက်မှုတွင်လုံခြုံရေးသည်အထူးသဖြင့်ဒေတာဘေ့စ်မေးမြန်းချက်များကိုကိုင်တွယ်သည့်အခါကျွန်ုပ်တို့ ဦး စားပေးရမည့်ပြ issues နာများထဲမှတစ်ခုဖြစ်သည်။ SQL Injection ဆိုသည်မှာတိုက်ခိုက်သူများသည် database များကိုအန္တရာယ်ရှိသော SQL Code ကိုထိုးသွင်းခြင်းဖြင့်ဒေတာဘေ့စ်များကိုကိုင်တွယ်နိုင်သည့်အသုံးများသောတိုက်ခိုက်မှုနည်းလမ်းဖြစ်သည်။ ထို့ကြောင့် ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များ နှင့် pdostatement ၏ဆင်ခြင်တုံတရားကိုဆင်ခြင်တုံတရားအသုံးပြုခြင်း --: FetchObject နည်းများသည်ထိုကဲ့သို့သောအန္တရာယ်များကိုထိရောက်စွာတားဆီးနိုင်သည်။

PDO နှင့်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များမှာအဘယ်နည်း။

PDO (PHP Data Obserts) သည် Database Access actstraction abstraction အလွှာတစ်ခုဖြစ်သည်။
ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များ သည် PDO မှပေးသောယန္တရားများကိုပထမ ဦး စွာသတ်မှတ်ရန်နှင့် parameters များကို ဦး စားပေးရန်ခွင့်ပြုသည့်ယန္တရားတစ်ခုဖြစ်ပြီးအသုံးပြုသူ၏အန္တရာယ်ရှိသောကုဒ်များကို 0 င်ရောက်သော်,

ဥပမာ -

 <?php
// ဖန်တီး PDO နမူနာ
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');

// Preprocessing ကြေညာချက်နှင့်အတူမေးမြန်းခြင်း
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);

// ရလဒ်ကိုအရာဝတ်ထုတစ်ခုအဖြစ်ရယူပါ
$user = $stmt->fetchObject();

if ($user) {
    echo "အသုံးပြုသူ: " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
} else {
    echo "အသုံးပြုသူကိုရှာမတွေ့ပါ。";
}
?>

ဤဥပမာတွင် placeholder : ID ကို parameters များကိုချည်နှောင်ရန်အသုံးပြုသည်။ SQL injection ကိုရှောင်ရှားခြင်း,

FetCobobject ကို မှန်ကန်စွာအသုံးပြုနည်း။

အဆိုပါ FetchObject နည်းလမ်းသည်ကျွန်ုပ်တို့အား query ကိုအရာဝတ်ထုတစ်ခုအဖြစ်တိုက်ရိုက်ပြန်ပို့ရန်ခွင့်ပြုသည်။ ပုံမှန်အားဖြင့်၎င်းသည်အမည်မသိ stdclass အရာဝတ်ထုကိုပြန်လည်ရရှိစေသော်လည်းအချက်အလက်များကိုအိမ်ရှင်အဖြစ်လက်ခံရန်စိတ်ကြိုက်အတန်းကိုလည်းသင်သတ်မှတ်နိုင်သည်။

ကျွန်ုပ်တို့တွင် အသုံးပြုသူ အတန်းတစ်ခုရှိသည်ဆိုပါစို့။

 <?php
class User {
    public $id;
    public $username;
    public $email;
}
?>

FetchOccoP ကို အသုံးပြုသည့်အခါအတန်းအမည်ကိုသတ်မှတ်ပါ -

 <?php
$stmt = $pdo->prepare('SELECT id, username, email FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);

$user = $stmt->fetchObject('User');

if ($user) {
    echo "ဝမ်းသာစွာနှုတ်ဆက်ခြင်း, " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
}
?>

ဤ၏အားသာချက်မှာဖွဲ့စည်းပုံသည်ပိုမိုရှင်းလင်းစွာချဲ့ထွင်ရန်ပိုမိုလွယ်ကူသည်။ ဥပမာအားဖြင့်, ယုတ္တိဗေဒအပြောင်းအလဲအတွက် အသုံးပြုသူ အတန်းသို့နည်းလမ်းများထည့်နိုင်သည်။

ဘေးကင်းလုံခြုံမှုအကြံပေးချက်များ

PDO နှင့် Fetterobjectobject ကို အသုံးပြုနေလျှင်ပင်အောက်ပါအချက်များကိုမှတ်သားထားဆဲဖြစ်သည်။

  • အသုံးပြုသူများမှထည့်သွင်းထားသော SQL ထုတ်ပြန်ချက်များကိုဘယ်သောအခါမျှတိုက်ရိုက်မခွဲခြားပါ။

  • အမြဲတမ်း placeholders ကိုသုံးပါ (အမည်ရှိ Placeholders သို့မဟုတ် Quick Placeholders) နှင့် parameters တွေကို bind ။

  • XSS တိုက်ခိုက်မှုများကိုကာကွယ်ရန်ဝက်ဘ်စာမျက်နှာများသို့အကြောင်းအရာ output ကိုစနစ်တကျမှလွတ်မြောက်ရန် htmlspecialchars များကို သုံးပါ။

  • ဥပမာအားဖြင့်သင့်တော်သောအမှားကိုင်တွယ်မှု mode များကိုသတ်မှတ်ပါ။

 <?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
  • ဖွံ့ဖြိုးရေးနှင့်ထုတ်လုပ်မှုပတ် 0 န်းကျင်များအကြားခွဲခြားသည်။ ဒေတာဘေ့စ်ဖွဲ့စည်းပုံကိုမပေါက်ကြားစေရန်အတွက်ထုတ်လုပ်မှုပတ်ဝန်းကျင်သည်အမှားအယွင်းများကိုတိုက်ရိုက်ပြသခြင်းကိုတားမြစ်သင့်သည်။

အပိုဆောင်းအကြောင်းအရာ: စုံစမ်းမှုပျက်ကွက်ခြင်း၏အပြောင်းအလဲနဲ့

အားကောင်းတဲ့စနစ်ကဒေတာဘေ့စ်အမှားတွေကိုလျောက်ပတ်စွာကိုင်တွယ်နိုင်သင့်သည်။ ဥပမာအားဖြင့်:

 <?php
try {
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
    $stmt->execute(['id' => $_GET['id']]);
    $user = $stmt->fetchObject('User');

    if (!$user) {
        header('Location: https://gitbox.net/not-found');
        exit;
    }

    echo "မင်္ဂလာပါ, " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
} catch (PDOException $e) {
    error_log($e->getMessage());
    header('Location: https://gitbox.net/error');
    exit;
}
?>

ဤဥပမာတွင်ကျွန်ုပ်တို့သည် query error အားခြွင်းချက်ကိုင်တွယ်ခြင်းဖြင့်အခြေအနေဖြစ်သည့်အခါဖော်ရွေသောအမှားစာမျက်နှာသို့ခုန်ချလိုက်သည်။