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