MySQL ဒေတာဘေ့စ်လုပ်ငန်းများအတွက် PHP ကိုအသုံးပြုသောအခါ developer များသည် MySQLI extensions တွင်ဆက်စပ်သောလုပ်ငန်းများကိုမကြာခဏ သုံး. ရှာဖွေတွေ့ရှိခြင်းနှင့်လုပ်ငန်းစဉ်ရလဒ်များကိုပြုလုပ်ရန်ဖြစ်သည်။ ဥပမာ MySQLI_QUERY () ကို MySQLI_RESULT OFF ကိုအလွယ်တကူရရှိနိုင်သည့် query ရလဒ်များကိုအလွယ်တကူရယူနိုင်သည်။ သို့သော် SQL ထုတ်ပြန်ချက်များကိုတည်ဆောက်ရာတွင် input parameters များကိုစနစ်တကျမလုပ်ဆောင်ပါက SQL Injection ပြ problems နာများကိုဖြစ်ပေါ်စေနိုင်သည့် SQL injection ပြ problems နာများကိုဖြစ်ပေါ်စေပြီးပုံမှန်မဟုတ်သောစုံစမ်းမှုရလဒ်များ,
အသုံးပြုသူအချက်အလက်များကိုမေးမြန်းသောစာမျက်နှာတစ်ခုရှိသည်ဆိုပါစို့, ကုဒ်သည်အောက်ပါအတိုင်းဖြစ်သည် -
<?php
$conn = new mysqli("localhost", "root", "password", "mydb");
$username = $_GET['username']; // အသုံးပြုသူထည့်သွင်းမှုမှ
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "အသုံးပြုသူ: " . $row["username"] . ",စာပို့: " . $row["email"] . "<br>";
}
} else {
echo "未找到အသုံးပြုသူ";
}
$conn->close();
?>
အသုံးပြုသူသည်အောက်ပါ URL ထဲသို့ဝင်လျှင် -
https://m66.net/user.php?username=admin' OR '1'='1
ထိုအခါ SQL ကြေညာချက်ဖြစ်လာလိမ့်မည်:
SELECT * FROM users WHERE username = 'admin' OR '1'='1'
၎င်းသည် authentication ကိုအခြေအနေကိုကျော်လွှားနိုင်ပြီးသုံးစွဲသူများအားလုံးအတွက်မှတ်တမ်းများပြန်ပို့ပေးလိမ့်မည်။
MySQLI_RESULT အရာဝတ်ထုကိုလုပ်ဆောင်ရန်ရလဒ်အနေဖြင့်ပြန်လည်ရောက်ရှိသည့်အချက်အလက်များသည် SQL ကြေငြာချက်၏ကွပ်မျက်မှုရလဒ်အပေါ်မူတည်သည်။ အကယ်. တရားမ 0 င်သောအခြေအနေများနှင့်ထုတ်ပြန်ကြေငြာချက်ကိုထုတ်ပြန်ခြင်းသည်မမျှော်လင့်သောအချက်အလက်များပါ 0 င်သောရလဒ်ကိုဘက်လိုက်မှုရှိလိမ့်မည်။
Misjudgment အခြေအနေများ - အထက်ဖော်ပြပါဥပမာ - ယုတ္တိဗေဒသည် $ ရလဒ် - နံပါတ်များသည် မှန်ကန်သည်ကိုဆုံးဖြတ်သည်။
ဒေတာယိုစိမ့်မှု - တိုက်ခိုက်သူများသည်အခြားအသုံးပြုသူများ၏ privacy ကိုဖတ်ရန်အခြေအနေများကိုတည်ဆောက်နိုင်သည်။
ရှုပ်ထွေးသောနောက်ဆက်တွဲစစ်ဆင်ရေးများ - အကယ်. သင်သည်ခွင့်ပြုချက်တရားစီရင်ချက်များကိုဆက်လက်ပြုလုပ်နေပါကရလဒ်များအပေါ် အခြေခံ. မှတ်တမ်းများနှင့်အခြားစစ်ဆင်ရေးများကိုပြုပြင်ပါကအကျိုးဆက်များမှာ ပို. လေးနက်လိမ့်မည်။
SQL injection ကို ပြင်ဆင်ခြင်း () နှင့် bind_param () () -
<?php
$conn = new mysqli("localhost", "root", "password", "mydb");
$username = $_GET['username'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "အသုံးပြုသူ: " . $row["username"] . ",စာပို့: " . $row["email"] . "<br>";
}
} else {
echo "未找到အသုံးပြုသူ";
}
$stmt->close();
$conn->close();
?>
Preprocessing ထုတ်ပြန်ချက်များကိုအသုံးပြုပြီးနောက် parameters တွေကိုအလိုအလျောက်ထွက်ပြေးတိမ်းရှောင်ခြင်း,
၎င်းသည်ကြိုတင်လျှောက်ထားခြင်းမပြုနိုင်သော်လည်းလုံခြုံရေးအာမခံချက်ကိုဖြည့်စွက်ရန်အတွက်သုံးစွဲသူထည့်သွင်းမှုအားလုံးသည်လိုအပ်သောစိစစ်စစ်ဆေးမှုကိုခံယူသင့်သည်။ ဥပမာအားဖြင့်:
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_STRING);
သို့မဟုတ်တရားမ 0 င်စာလုံးများနှင့်သော့ချက်စာလုံးများကိုငြင်းပယ်ရန်စိတ်ကြိုက်စီစစ်ခြင်းဆိုင်ရာယုတ္တိဗေဒ။
developer များမှထပ်ခါတလဲလဲအမှားများကိုမတူကွဲပြားသော module များဖြင့်ထပ်ခါတလဲလဲအမှားများကိုရှောင်ရှားနိုင်ရန်အတွက်ဒေတာဘေ့စ် 0 င်ရောက်မှုဆိုင်ရာယုတ္တိဗေဒကိုစုစည်းထားသောလူတန်းစားသို့မဟုတ် function တစ်ခုအဖြစ် encapsulate လုပ်ရန်အကြံပြုသည်။
MySQLI_RESULEL ကိုယ်တိုင်က SQL injections ပြ problems နာများကိုဖြစ်ပေါ်စေမည်မဟုတ်သော်လည်း unescaped sql ထုတ်ပြန်ချက်များဖြင့်အသုံးပြုပါက၎င်းသည်စုံစမ်းမှုအဆင့်တွင်ကြီးမားသောလျှို့ဝှက်အန္တရာယ်များကိုဖြစ်ပေါ်စေလိမ့်မည်။ အသုံးပြုသူ input တွင်ပါ 0 င်နေသရွေ့စုံစမ်းမှုလုပ်ငန်းလည်ပတ်မှုသည်မည်မျှပင်အန္တရာယ်ဖြစ်စေနိုင်ပါစေအသုံးဝင်သောထုတ်ပြန်ချက်များကိုအသုံးပြုရမည်။
သတိရပါ - ** အသုံးပြုသူအမည်တစ်ခုတည်းသော်ပင်လျှင်မည်သည့် input ကိုမယုံကြည်ပါနှင့်။ ** M66.net ကဲ့သို့သောအွန်လိုင်း 0 န်ဆောင်မှုများတွင်ဤအခြေခံလုံခြုံရေးအစီအမံများကိုလျစ်လျူရှုပါကအနည်းဆုံးအချက်အလက်များသည်ပုံမှန်မဟုတ်သောကြောင့်အဆိုးဆုံးတွင်စနစ်ပျက်သွားသည်။
၎င်းသည် PHP developer တိုင်းသည်အကျိုးသင့်အကြောင်းသင့်ရှိသောအကာအကွယ်ပေးမှုအစီအမံများပြုလုပ်ရန်နှင့်ကုဒ်အဆင့်မှ SQL Injection ကိုဖယ်ရှားရန်အတွက်မလိုလားအပ်သောတာဝန်ဖြစ်သည်။