<article>
<h3>တစ်、နိဒါန်း</h3>
ဖွံ့ဖြိုးရေးတွင်Webလျှောက်ထားတဲ့အခါ,数据缓存是提高性能和响应速度的常用技术之တစ်。မည်မှျပင်,cache ယန္တရား၏အထူးသဖြင့်ကြောင့်,လုံခြုံရေးပြ issues နာများရှိနိုင်သည်。ဒီဆောင်းပါးခွဲခြမ်းစိတ်ဖြာပါလိမ့်မယ်PHPဒေတာ cache ၏လုံခြုံရေး,နှင့်သက်ဆိုင်ရာကာကွယ်စောင့်ရှောက်ရေးမဟာဗျူဟာပေး。
<h3>နှစ်、လုံခြုံရေးခွဲခြမ်းစိတ်ဖြာ</h3>
<ol>
<li><strong>cache ကိုထိုးဖောက်မှု</strong><br>
cache ကိုထိုးဖောက်မှု是指恶意用户通过构造恶意请求,cache ကိုကျော်လွှားပြီးဒေတာဘေ့စ်ကိုတိုက်ရိုက်ရှာဖွေပါ。တစ်般来说,cache system သည်တောင်းဆိုမှုကိုလက်ခံရရှိပြီးနောက်,ပထမ ဦး စွာသက်ဆိုင်ရာအချက်အလက်များကို cache တွင်တည်ရှိခြင်းရှိမရှိစစ်ဆေးပါ,ဒါမတည်ရှိပါက,ထို့နောက်ဒေတာဗေ့စ်ကိုရှာဖွေပြီးရလဒ်များကို cache ထဲတွင်သိမ်းထားပါ。Attackers သည် query အခြေအနေများတည်ဆောက်နိုင်ရန်အတွက်ရလဒ်များကိုသိမ်းဆည်းထားနိုင်မည်မဟုတ်စေရန်,ထို့ကြောင့်ဒေတာဗေ့စ်ကိုအချိန်တိုင်းမေးမြန်းလိမ့်မည်,ဒေတာဘေ့စအပေါ်အလွန်အကျွံဖိအားဖြစ်စေသည်。
<br>အဖေြ:ဒေတာဘေ့စ်ကိုမေးမြန်းခြင်းမပြုမီ,အဆိုပါတရားဝင်မှုစစ်ဆေးမှုများကိုတောင်းဆိုထားသော parameters တွေကိုအပေါ်ဖျော်ဖြေနိုင်ပါတယ်,အသုံးပြုသူတောင်းဆိုချက်များ၏တရားဝင်မှုကိုစစ်ဆေးပါ。ဥပမာအားဖြင့်,အသုံးပြုသူများအတွက်ID,ပုံမှန်အသုံးအနှုန်းများသို့မဟုတ်စစ်ထုတ်စက်များကိုကန့်သတ်ရန်အသုံးပြုနိုင်သည်,ခြွင်းချက်သို့မဟုတ်တရားမဝင် parameters တွေကိုဖယ်ထုတ်ပါ。</li>
</ol>
<p>Code Page:</p>
<div class="container">
<pre>
<code>
// အသုံးပြုသူကိုဘာသာပြန်ပါIDcache အဖြစ်Key
$cacheKey = 'user_' . $userId;
// cache ထဲမှာဒေတာရှိမရှိဆုံးဖြတ်ရန်
if ($cache->exists($cacheKey)) {
// cache မှဒေတာရယူပါ
$data = $cache->get($cacheKey);
} else {
// Parameter တရားဝင်တရားဝင်မှုစစ်ဆေးမှု
if (preg_match('/^\d+$/', $userId)) {
// ဒေတာဘေ့စ်မှအချက်အလက်ရှာဖွေခြင်းအချက်အလက်
$data = $db->query('SELECT * FROM users WHERE id = ?', [$userId]);
// Query ကိုသိမ်းဆည်းရန် Cache သို့သိမ်းဆည်းပါ
$cache->set($cacheKey, $data);
} else {
// တရားမဝင် parameters တွေကို,အမှားမက်ဆေ့ခ်ျကိုပြန်ပို့ပါ
$data = 'Invalid user ID';
}
}
Code Perfection:
// Bloom filter စာကြည့်တိုက်ကိုအသုံးပြုခြင်း
require_once 'bloom_filter.php';
// Bloom filter ကိုရေးပါ
$bf = new BloomFilter();
// စုံစမ်းမှုအခြေအနေ၏ hash တန်ဖိုးကို Bloom filter သို့ထည့်ပါ
$bf->add(hash('md5', $condition));
// Bloom filter တွင်မေးမြန်းမှုအခြေအနေရှိ,
if ($bf->contains(hash('md5', $condition))) {
// cache မှဒေတာရယူပါ
$data = $cache->get($cacheKey);
} else {
// တရားမဝင် parameters တွေကို,အမှားမက်ဆေ့ခ်ျကိုပြန်ပို့ပါ
$data = 'Invalid condition';
}
Code Perfection:
// cache သော့ခတ်ကိုရယူပါ
$lockKey = 'cache_lock_' . $cacheKey;
if ($cache->add($lockKey, 1, 10)) {
// ဒေတာဘေ့စ်ကိုမေးမြန်းပါ
$data = $db->query('SELECT * FROM hot_data WHERE id = ?', [$cacheKey]);
// Query ကိုသိမ်းဆည်းရန် Cache သို့သိမ်းဆည်းပါ,နှင့်သက်တမ်းကုန်ဆုံးချိန်သတ်မှတ်ထားပါ
$cache->set($cacheKey, $data, 60);
// cache ကိုသော့ခတ်
$cache->delete($lockKey);
} else {
// အခြားတောင်းဆိုမှုရှာဖွေမှုရလဒ်များကိုစောင့်ပါ
usleep(1000);
// cache မှဒေတာရယူပါ
$data = $cache->get($cacheKey);
}