SQL Injection သည်တိုက်ခိုက်မှုနည်းလမ်းဖြစ်သည်။ တိုက်ခိုက်သူတစ် ဦး သည် Database အား SQL Code သို့မသွားသော SQL Code ကိုထည့်သွင်းခြင်းအားဖြင့်ခွင့်ပြုချက်မရှိဘဲလုပ်ဆောင်မှုများပြုလုပ်ရန်တားဆီးထားသည်။ Delete ထုတ်ပြန်ချက်များအတွက်တိုက်ခိုက်သူများသည် SQL Injection မှတစ်ဆင့်မဖျက်သင့်ဘဲဒေတာဗားရှင်းတစ်ခုလုံးကိုဖျက်ပစ်ခြင်းကိုပင်ဖျက်ပစ်နိုင်သည်။
SQL Injection ကိုထိရောက်စွာကာကွယ်ရန်အတွက်အကြံပြုထားသောချဉ်းကပ်နည်းသည် ပြင်ဆင်ထားသောထုတ်ပြန်ချက်များကို အသုံးပြုရန်ဖြစ်သည်။ MySQLI နှင့် PDO ၏ extensions များကို MySQL ဒေတာဘေ့စ်များနှင့်အပြန်အလှန်ဆက်သွယ်သည့်အခါအသုံးပြုသော MySQLI နှင့် PDO extension များကိုထောက်ပံ့ပေးသည်။ ဤနည်းအားဖြင့် SQL query နှင့် input အသုံးပြုသူအချက်အလက်များကိုခွဲထုတ်နိုင်သည်။ အားဖြင့် SQL ထုတ်ပြန်ချက်များသို့ထိုးသွင်းခြင်းမှအန္တရာယ်ရှိသော input ကိုတားဆီးနိုင်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ဒေတာဘေ့စ်ဆက်သွယ်မှု</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database_name"</span></span><span>);
</span><span><span class="hljs-comment">// ဆက်သွယ်မှုကိုစစ်ဆေးပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// ငါတို့ဖျက်ချင်တယ်ဆိုပါစို့IDအသုံးပြုသူတစ် ဦး မှပေးအပ်တန်ဖိုးများမှတ်တမ်းများ</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]; </span><span><span class="hljs-comment">// မှURLအသုံးပြုသူမှပေးသောအသုံးပြုသူကိုရယူပါID</span></span><span>
</span><span><span class="hljs-comment">// ကာကွယ်တားဆီးဖို့ပြင်ဆင်ထားထုတ်ပြန်ချက်များကိုသုံးပါSQLသွင်းခြင်း</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>); </span><span><span class="hljs-comment">// "i" အဆိုပါ parameter သည် integer type ဖြစ်ပါတယ်ကြောင်းဖော်ပြသည်</span></span><span>
</span><span><span class="hljs-comment">// Execution ကြေငြာချက်</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// ပယ်ဖျက်ခြင်းသည်အောင်မြင်မှုရှိမရှိစစ်ဆေးပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->affected_rows > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"မှတ်တမ်းများကိုဖျက်ပစ်လိုက်ပြီ。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"မှတ်တမ်းကိုရှာမတွေ့ပါသို့မဟုတ်ပယ်ဖျက်ခြင်းမအောင်မြင်ပါ。"</span></span><span>;
}
</span><span><span class="hljs-comment">// ဆက်သွယ်မှုကိုပိတ်ပါ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
အထက်ဖော်ပြပါကုဒ်များတွင် ဒေါ်လာ stmt_param () ကို အသုံးပြုသူ၏ ID input ကို bindt လုပ်ရန်အသုံးပြုသည်။ ဆိုလိုသည်မှာ parameter သည်ကိန်းဂဏန်းအမျိုးအစားဖြစ်သည်။ ၎င်းသည် SQL Injection ကို ထိရောက်စွာကာကွယ်နိုင်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// ဒေတာဘေ့စ်ဆက်သွယ်မှု</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=database_name'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// ငါတို့ဖျက်ချင်တယ်ဆိုပါစို့IDအသုံးပြုသူတစ် ဦး မှပေးအပ်တန်ဖိုးများမှတ်တမ်းများ</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]; </span><span><span class="hljs-comment">// မှURLအသုံးပြုသူမှပေးသောအသုံးပြုသူကိုရယူပါID</span></span><span>
</span><span><span class="hljs-comment">// ပြင်ဆင်ထားထုတ်ပြန်ချက်များကိုသုံးပါ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':id'</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_INT</span></span><span>);
</span><span><span class="hljs-comment">// Execution ကြေငြာချက်</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// ပယ်ဖျက်ခြင်းသည်အောင်မြင်မှုရှိမရှိစစ်ဆေးပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rowCount</span></span><span>() > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"မှတ်တမ်းများကိုဖျက်ပစ်လိုက်ပြီ。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"မှတ်တမ်းကိုရှာမတွေ့ပါသို့မဟုတ်ပယ်ဖျက်ခြင်းမအောင်မြင်ပါ。"</span></span><span>;
}
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"အမှား: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
PDO တွင်အသုံးပြုသူ bindparam () တွင်အသုံးပြုသူမှထည့်သွင်းထားသော parameters တွေကို sql stred တစ်ခုထဲသို့ထည့်သွင်းထားပြီး PDO :: Param_int မှတဆင့်ကိန်းဂဏန်းတစ်ခုအဖြစ်သတ်မှတ်သည်။ ၎င်းသည် SQL ထိုးဆေးကိုကာကွယ်ပေးသည်။
ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များကိုအသုံးပြုရန်အပြင်အခြားထိရောက်သောလုံခြုံရေးကာကွယ်မှုသည်အသုံးပြုသူထည့်သွင်းမှုများကိုအတည်ပြုရန်နှင့်စစ်ထုတ်ရန်ဖြစ်သည်။ အထူးသဖြင့်အိုင်ဒီအကွက်များအတွက်ဖျက်ခြင်းလုပ်ငန်းများအတွက်,
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];
</span><span><span class="hljs-comment">// input ကိုတရားဝင်ကိန်းတစ်ခုဖြစ်ကြောင်းအတည်ပြုပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">filter_var</span></span><span>(</span><span><span class="hljs-variable">$user_id</span></span><span>, FILTER_VALIDATE_INT)) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"မမှန်ကန်သောအသုံးပြုသူID"</span></span><span>);
}
</span><span><span class="hljs-comment">// ဒေတာဘေ့စပယ်ဖျက်ရေးစစ်ဆင်ရေးလုပ်ဆောင်ပါ</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
အသုံးပြုသူမှပေးသော ID သည်တရားဝင်ကိန်းဖြစ်သည်ကိုစစ်ဆေးရန် filter_var () function ကိုသုံးပါ။ မရရှိလျှင်, ကွပ်မျက်တိုက်ရိုက်ရပ်တန့်လိမ့်မည်။ ဒီအပိုဆောင်းစိစစ်အတည်ပြုလုံခြုံရေးကိုတိုးတက်စေနိုင်ပါတယ်။
ဒေတာဘေ့စ်နှင့်အပြန်အလှန်ဆက်သွယ်သောအခါ အနည်းဆုံးခွင့်ပြုချက်များ၏နိယာမကို အမြဲတမ်းလိုက်နာပါ။ ဒေတာဘေ့စအကောင့်သည်လိုအပ်သောလုပ်ရပ်များပြုလုပ်ရန်ခွင့်ပြုချက်သာရှိသည်။ ဥပမာအားဖြင့်ပယ်ဖျက်ခြင်းသည်ဒေတာဘေ့စ်အကောင့်များသို့အပြည့်အ 0 ခွင့်ပြုမည့်အစားသီးခြားဒေတာဘေ့စ်အကောင့်များကိုသာပြုလုပ်သင့်သည်။ ဤနည်းအားဖြင့် SQL injection အားနည်းချက်ကိုဖြစ်ပေါ်နေလျှင်ပင်တိုက်ခိုက်သူတစ် ဦး လုပ်ဆောင်နိုင်သည့်လုပ်ဆောင်မှုများမှာအကန့်အသတ်ရှိသည်။
အလားအလာရှိသော SQL injection တိုက်ခိုက်မှုများကိုအချိန်မီရှာဖွေတွေ့ရှိနိုင်ရန်အတွက်ဒေတာဘေ့စ်၏ SQL logging function ကို enable လုပ်ရန်နှင့်ဒေတာဘေ့စ်ကိုစောင့်ကြည့်ရန်အကြံပြုသည်။ ဤသည်တိုက်ခိုက်မှုတစ်ခုဖြစ်ပွားသည့်အခါပုံမှန်မဟုတ်သောလှုပ်ရှားမှုများကိုခြေရာခံသည်။
နောက်ဆုံးအနေဖြင့် PHP, Databases နှင့်သက်ဆိုင်သောအစိတ်အပိုင်းများအားလုံးကိုဆက်လက်ထိန်းသိမ်းထားခြင်းသည်လုံခြုံရေးအားနည်းချက်များကိုကာကွယ်ရန်သော့ချက်ဖြစ်သည်။ စနစ်များအားလုံးသည်နောက်ဆုံးပေါ်လုံခြုံရေးပြင်ဆင်မှုများနှင့်အတူတင်ဆောင်ကြောင်းသေချာစေရန်လုံခြုံရေးသတိပေးချက်များကိုမကြာခဏစစ်ဆေးပါ။
သက်ဆိုင်သောတက်(ဂ်)များ:
SQL