လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Secure login verification ယန္တရားတစ်ခုအကောင်အထည်ဖော်ရန် MySQLI :: stmt_init ကိုသုံးပါ

Secure login verification ယန္တရားတစ်ခုအကောင်အထည်ဖော်ရန် MySQLI :: stmt_init ကိုသုံးပါ

M66 2025-06-06

PHP ဝက်ဘ်ဆိုက်များကိုတီထွင်သောအခါအသုံးပြုသူ login function သည်၎င်းသည်အဓိကအစိတ်အပိုင်းတစ်ခုနီးပါးရှိသည်။ သို့သော်အသုံးပြုသူအားစုစည်းမှုကိုမတော်တဆထိခိုက်စေပါက SQL Injection Attacks ကိုထိခိုက်နိုင်သည်။ MySQLI :: stmt_init သည် MySQLI extension မှထောက်ပံ့ပေးသော MySQLI extension မှထောက်ပံ့ပေးသောနည်းလမ်းဖြစ်သည်။ ဤဆောင်းပါးသည်လုံခြုံသော login authentication ယန္တရားကိုအကောင်အထည်ဖော်ရန်မည်သို့အသုံးပြုရမည်ကိုဖော်ပြရန်တိကျသောဥပမာတစ်ခုကိုအသုံးပြုမည်။

အဘယ်ကြောင့် SQL ဆေးထိုးကာကွယ်တားဆီး?

SQL Injection ဆိုသည်မှာတိုက်ခိုက်သူတစ် ဦး သည်တိုက်ခိုက်သူတစ် ဦး သည်မူလရှာဖွေမှုဆိုင်ရာယုတ္တိဗေဒကိုထည့်သွင်းထားသောကွက်လပ်သို့ထိုးသွင်းခြင်းဖြင့်မူရင်းမေးမြန်းချက်ယုတ္တိဗေဒနှင့်အတူ tampers များနှင့်အတူ tampers ဥပမာအားဖြင့်, သင်သည် SQL ကိုတိုက်ရိုက် splice လျှင် -

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

တိုက်ခိုက်သူသည် username သို့မဟုတ် password အဖြစ် 'သို့မဟုတ်' 1 '=' 1 ကိုထည့်သွင်းနိုင်သည်။

MySQLI :: stmt_init နှင့် preprocessing ထုတ်ပြန်ချက်များ

MySQLI :: stmt_init ကို mySQLI_STMT အရာဝတ်ထုကိုအစပြုရန်အသုံးပြုသည်။ ၎င်းသည် Preprocessing ထုတ်ပြန်ချက်များကိုအကောင်အထည်ဖော်ရာတွင်ပထမဆုံးခြေလှမ်းဖြစ်သည်။ ၎င်းသည် SQL ကိုအသုံးပြုသူထည့်သွင်းမှုမှတိကျစွာခွဲခြားနိုင်သည်။

နမူနာကုဒ်: Secure login verification

ဒီမှာလုံခြုံတဲ့ 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 ထက်အများကြီးပိုလုံခြုံသည်။