PHP ဝက်ဘ်ဆိုက်များကိုတီထွင်သောအခါအသုံးပြုသူ login function သည်၎င်းသည်အဓိကအစိတ်အပိုင်းတစ်ခုနီးပါးရှိသည်။ သို့သော်အသုံးပြုသူအားစုစည်းမှုကိုမတော်တဆထိခိုက်စေပါက SQL Injection Attacks ကိုထိခိုက်နိုင်သည်။ MySQLI :: stmt_init သည် MySQLI extension မှထောက်ပံ့ပေးသော MySQLI extension မှထောက်ပံ့ပေးသောနည်းလမ်းဖြစ်သည်။ ဤဆောင်းပါးသည်လုံခြုံသော login authentication ယန္တရားကိုအကောင်အထည်ဖော်ရန်မည်သို့အသုံးပြုရမည်ကိုဖော်ပြရန်တိကျသောဥပမာတစ်ခုကိုအသုံးပြုမည်။
SQL Injection ဆိုသည်မှာတိုက်ခိုက်သူတစ် ဦး သည်တိုက်ခိုက်သူတစ် ဦး သည်မူလရှာဖွေမှုဆိုင်ရာယုတ္တိဗေဒကိုထည့်သွင်းထားသောကွက်လပ်သို့ထိုးသွင်းခြင်းဖြင့်မူရင်းမေးမြန်းချက်ယုတ္တိဗေဒနှင့်အတူ tampers များနှင့်အတူ tampers ဥပမာအားဖြင့်, သင်သည် SQL ကိုတိုက်ရိုက် splice လျှင် -
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
တိုက်ခိုက်သူသည် username သို့မဟုတ် password အဖြစ် 'သို့မဟုတ်' 1 '=' 1 ကိုထည့်သွင်းနိုင်သည်။
MySQLI :: stmt_init ကို mySQLI_STMT အရာဝတ်ထုကိုအစပြုရန်အသုံးပြုသည်။ ၎င်းသည် Preprocessing ထုတ်ပြန်ချက်များကိုအကောင်အထည်ဖော်ရာတွင်ပထမဆုံးခြေလှမ်းဖြစ်သည်။ ၎င်းသည် SQL ကိုအသုံးပြုသူထည့်သွင်းမှုမှတိကျစွာခွဲခြားနိုင်သည်။
ဒီမှာလုံခြုံတဲ့ login ပုံစံစိစစ်အတည်ပြုဥပမာတစ်ခု
<?php
// ဒေတာဘေ့စ်ဆက်သွယ်မှု
$mysqli = new mysqli("localhost", "db_user", "db_password", "my_database");
// ဆက်သွယ်မှုကိုစစ်ဆေးပါ
if ($mysqli->connect_errno) {
die("ဆက်သွယ်မှုမအောင်မြင်ပါ: " . $mysqli->connect_error);
}
// အသုံးပြုသူလက်အောက်ခံအသုံးပြုသူအမည်နှင့်စကားဝှက်
$username = $_POST['username'];
$password = $_POST['password'];
// preprocessing ကြေညာချက်အရာဝတ်ထုကိုစတင်ပါ
$stmt = $mysqli->stmt_init();
// ရေးသား SQL စုံစမ်းမှုကြေညာချက်,အသုံးပြု ? နေရာချထားသူ
$sql = "SELECT id, password_hash FROM users WHERE username = ?";
// ပြင်ဆင်မှုကြေညာချက်
if ($stmt->prepare($sql)) {
// parameters တွေကိုချည်ထား(s ညှစ် string ပုံနှိပ်စာ)
$stmt->bind_param("s", $username);
// Execution ကြေငြာချက်
$stmt->execute();
// ရလဒ်များကိုရယူပါ
$stmt->bind_result($user_id, $password_hash);
// ရလဒ်ရှိမရှိဆုံးဖြတ်ရန်
if ($stmt->fetch()) {
// စကားဝှက်ကိုစစ်ဆေးပါ(ဒေတာဘေ့စကိုသိမ်းဆည်းထားကြောင်းယူဆ password_hash() ရလဒ်များ)
if (password_verify($password, $password_hash)) {
echo "အောင်မြင်စွာဝင်ပါ,ကြိုဆိုပါတယ် ID:$user_id";
// session တစ်ခုသို့မဟုတ်ခုန် set up,ဥပမာအားဖြင့်:
// header("Location: https://m66.net/dashboard.php");
} else {
echo "စကားဝှက်";
}
} else {
echo "အသုံးပြုသူအမည်မရှိပါ";
}
// ကြေငြာချက်
$stmt->close();
} else {
echo "SQL ထုတ်ပြန်ကြေငြာချက်ပြင်ဆင်မှုမအောင်မြင်ပါ: " . $mysqli->error;
}
// ဆက်သွယ်မှုကိုပိတ်ပါ
$mysqli->close();
?>
MySQLI :: stmt_init ကို MySQLI :: stmt_init ဖြင့် အသုံးပြု. SQL ဆေးထိုးတိုက်ခိုက်မှုများကိုထိရောက်စွာတားဆီးနိုင်သည်။ Preprocessing ထုတ်ပြန်ချက်များကိုအထူးသဖြင့်ဒေတာဘေ့စ်လုပ်ငန်းများပါ 0 င်သည့်အချိန်တွင်အသုံးပြုသူထည့်သွင်းမှုများကိုပြုလုပ်ရန်အမြဲတမ်းအသုံးပြုသင့်သည်။ ထို့အပြင် password_hash () နှင့် password_verify () ကဲ့သို့သောလုပ်ဆောင်ချက်များကိုစကားဝှက်လုံခြုံရေးကိုမြှင့်တင်ရန်အသုံးပြုသင့်သည်။
အကယ်. သင်သည် login system သို့မဟုတ် user authentication module တစ်ခုကိုတည်ဆောက်နေပါကဤနည်းလမ်းကိုပထမ ဦး ဆုံးသုံးပါ, ရိုးရာ string splicing ထက်အများကြီးပိုလုံခြုံသည်။