PHP Development တွင် Database Interaction သည်မလွှဲမရှောင်တစ်စိတ်တစ်ပိုင်းဖြစ်သည်။ အစပြုသူနှင့်အချို့သောအကြီးတန်း developer များပင်လျှင် string splicing မှတစ်ဆင့် SQL ထုတ်ပြန်ချက်များကိုတည်ဆောက်နေဆဲဖြစ်သည်။ ဤနည်းလမ်းသည်ရိုးရှင်းပြီးထိုးထွင်းသိမြင်မှုရှိပေမဲ့၎င်းတွင်လုံခြုံမှု, ထိန်းသိမ်းနိုင်မှုနှင့်စွမ်းဆောင်ရည်အရဝှက်ထားသောအန္တရာယ်များစွာရှိသည်။ MySQLI :: ပိုမိုကျယ်ပြန့်စွာကျယ်ပြန့်သော ကြိုတင်. ကြိုတင်ပြင်ဆင်ထားသည့်ကြေညာချက်) ကိုအဘယ်ကြောင့်အသုံးပြုရသည့်အတွက်ဤဆောင်းပါးသည်အဘယ်ကြောင့်ပိုမိုလုံခြုံ။ ပိုမိုထိရောက်သောရွေးချယ်မှုတစ်ခုဖြစ်ပြီးဖွံ့ဖြိုးတိုးတက်မှုအတွက်လျှောက်လွှာကိုပြသရန်အမှန်တကယ်ကိစ္စများကိုပေါင်းစပ်ထားသည်။
ရိုးရာ SQL ချုပ်နည်းလမ်းများသည်များသောအားဖြင့်အောက်ပါအတိုင်းဖြစ်သည် -
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $user_id";
$result = mysqli_query($conn, $query);
$ user_id ကို လုံးဝအတည်မပြုရသေးပါကတိုက်ခိုက်သူသည် 1 သို့မဟုတ် 1 = 1 စသည့်သွင်းအားစုများကိုအလွယ်တကူတည်ဆောက်နိုင်သည်။ ထို့နောက်ဒေတာဘေ့စ်တွင်အထိခိုက်မခံသောအချက်အလက်များကိုရှောင်ကွင်းနိုင်သည်။ ဤတိုက်ခိုက်မှုနည်းလမ်းကို SQL Injection အမည်ရှိသော SQL Injection သည်အသုံးအများဆုံးနှင့်အန္တရာယ်ရှိသောလုံခြုံရေးအားနည်းချက်တစ်ခုဖြစ်သည်။
MySQLI :: stmt_init ကို အသုံးပြု. Preprocessing ထုတ်ပြန်ချက်များကိုဖန်တီးခြင်းနှင့်အသုံးပြုခြင်းကိုအသုံးပြုခြင်းသည် SQL injection ကိုထိရောက်စွာတားဆီးနိုင်သည်။ ကြိုတင်မဆိုထုတ်ပြန်ချက်များသည် SQL ထုတ်ပြန်ကြေငြာချက်ကို parameter data မှဖွဲ့စည်းပုံကိုခွဲခြားထားပြီး parameter data များကို parameter data ကို SQL ညွှန်ကြားချက်များအဖြစ်ခွဲခြမ်းစိတ်ဖြာလိမ့်မည်မဟုတ်ပါ။
$conn = new mysqli("localhost", "user", "password", "database");
$stmt = $conn->stmt_init();
$stmt->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$user_id = $_GET['id'];
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "<br>";
}
ဒီဥပမာမှာ ? placeholder တစ်ခုဖြစ်သော bind_param သည် data variable ၏ data type အမျိုးအစားကိုသတ်မှတ်ပြီး variable တန်ဖိုးကိုချည်ထားသည်။ ဤချဉ်းကပ်မှုသည်လုံခြုံရုံသာမက Code ကိုရှင်းလင်းစေသည်။
SQL splicing syntax အဆင့်ရှိကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များထက်တိုတောင်းသော်လည်းကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များသည်ဒေတာဘေ့စ်ကွပ်မျက်မှုအဆင့်မှအကောင်အထည်ဖော်မှုပိုမိုမြင့်မားသည်။
SQL ကိုအကြိမ်ကြိမ်အကောင်အထည်ဖော်သည့်အခါ (ထိုကဲ့သို့သောမှတ်တမ်းများကိုကွင်းထဲတွင်ထည့်ခြင်းကဲ့သို့သော) ဒေတာဘေ့စ်သည်ကြိုတင်သတ်မှတ်ထားသည့်ထုတ်ပြန်ချက်များကိုစုဆောင်းနိုင်ပြီးပုံတူစုစည်းမှုနှင့်အချိန်ခွဲခြမ်းစိတ်ဖြာခြင်းနှင့်စွမ်းဆောင်ရည်ကိုပြောင်းလဲခြင်းနှင့်အချိန်ခွဲခြမ်းစိတ်ဖြာခြင်းကိုလျှော့ချနိုင်သည်။
$stmt = $conn->stmt_init();
$stmt->prepare("INSERT INTO logs (message, created_at) VALUES (?, ?)");
$stmt->bind_param("ss", $message, $created_at);
foreach ($logs as $log) {
$message = $log['msg'];
$created_at = $log['time'];
$stmt->execute();
}
ဆန့်ကျင်ဘက်အနေဖြင့်သင်သည် splicing ထုတ်ပြန်ချက်များကိုအသုံးပြုပါကဒေတာဘေ့စ်သည် SQL ကိုအချိန်တိုင်းခွဲခြမ်းစိတ်ဖြာရန်နှင့်တည်ဆောက်ရန်လိုအပ်သည်။
စီမံကိန်းသည်အတိုင်းအတာတစ်ခုအထိရှုပ်ထွေးသောအခါ SQL ထုတ်ပြန်ချက်များတွင်ပိုမိုများပြားသော variable များနှင့်ဒေတာအမျိုးအစားများပိုမိုများပြားလာလိမ့်မည်။ stmt_init ကို အသုံးပြုခြင်းနှင့်၎င်း၏ပံ့ပိုးမှုနည်းလမ်းများသည် parameter binding နှင့် variable ခွဲထုတ်ခြင်းများကိုပိုမိုအလိုလိုသိစေခြင်း,
ထို့အပြင် Parameter သည်ဒေတာအမျိုးအစားကိုအတိအလင်းဖြတ်သန်းသွားရမည်ဖြစ်သော Parameter သည်ဒေတာအမျိုးအစားကိုအတိအလင်းဖြတ်သန်းရမည်။
အမှန်တကယ်စီမံကိန်းများတွင် URL သည် Parameter input အတွက်အဓိက entry ကိုဖြစ်သည်။ ဥပမာ -
https://m66.net/user.php?id=1
ဤ URL အမျိုးအစားကို SQL သို့တိုက်ရိုက်ဖြည့်ဆည်းပေးလျှင် $ _GET ['ID' ကိုမှတစ်ဆင့် SQL သို့တိုက်ရိုက်ကြည့်ပါကတိုက်ခိုက်မှုတစ်ခုဖြစ်လာရန်အလွန်လွယ်ကူသည်။ Proprocessing Storder သည်တိုက်ခိုက်သူသည်အလားတူအရာတစ်ခုခုကို 0 င်ရောက်ခြင်းကိုပင်သေချာစေသည်။
https://m66.net/user.php?id=1 OR 1=1
စနစ်လုံခြုံရေးကိုအခြေခံကျကျကာကွယ်ထားသည့်ဒေတာဘေ့စ်ကအခြေခံအားဖြင့် SQL ညွှန်ကြားချက်အဖြစ်ကွပ်မျက်ခြင်းမရှိဘဲထိုစနစ်သည် input ကို string parameter တစ်ခုအနေဖြင့်မှန်ကန်စွာအသိအမှတ်ပြုနိုင်သည်။
PHP Project Development တွင်မှန်ကန်သောဒေတာဘေ့စ်အပြန်အလှန်ဆက်သွယ်မှုနည်းလမ်းကိုရွေးချယ်ခြင်းသည်စနစ်၏လုံခြုံရေး, တည်ငြိမ်မှုနှင့်စွမ်းဆောင်ရည်အတွက်အလွန်အရေးကြီးသည်။ MySQLI :: stmt_init နှင့် preprocessing ထုတ်ပြန်ချက်များသည်အစပိုင်းတွင်အနည်းငယ်ရှုပ်ထွေးနေပုံရသော်လည်းကြီးမားသောဖွံ့ဖြိုးရေးစီမံကိန်းအတွက်မရှိမဖြစ်လိုအပ်သောအာမခံချက်များနှင့်စွမ်းဆောင်ရည်ဆိုင်ရာတိုးတက်မှုများရှိသည်။
နောက်မှဆုံးရှုံးမှုအတွက်ပြုလုပ်မည့်အစားအစမှအစိုင်အခဲအုတ်မြစ်ချခြင်းအားဖြင့် SQL splicing splicing levicing lets များကိုပိုမိုထိရောက်စေရန်,
သက်ဆိုင်သောတက်(ဂ်)များ:
SQL