<article>
<h3>1つ、導入</h3>
開発中Web適用するとき,数据缓存是提高性能和响应速度的常用技术之1つ。しかし,キャッシュメカニズムの特殊性のため,セキュリティの問題があるかもしれません。この記事で分析しますPHPデータキャッシュのセキュリティ,対応する保護戦略を提供します。
<h3>二、セキュリティ分析</h3>
<ol>
<li><strong>キャッシュ浸透</strong><br>
キャッシュ浸透是指恶意用户通过构造恶意请求,キャッシュをバイパスして、データベースを直接クエリします。1つ般来说,キャッシュシステムがリクエストを受信した後,まず、対応するデータがキャッシュに存在するかどうかを確認します,存在しない場合,次に、データベースを照会し、結果をキャッシュに保存します。攻撃者はクエリ条件を構築して、結果が決してキャッシュされないようにすることができます,したがって、データベースは毎回照会されます,データベースに過度の圧力を引き起こします。
<br>解決:データベースを照会する前に,合法的なチェックは、要求されたパラメーターで実行できます,ユーザーリクエストの合法性を確認します。例えば,ユーザー向けID,正規表現またはフィルターを使用して制限できます,例外または違法なパラメーターを除外します。</li>
</ol>
<p>コードの例:</p>
<div class="container">
<pre>
<code>
// ユーザーを翻訳しますIDキャッシュとしてKey
$cacheKey = 'user_' . $userId;
// キャッシュにデータがあるかどうかを判断します
if ($cache->exists($cacheKey)) {
// キャッシュからデータを取得します
$data = $cache->get($cacheKey);
} else {
// パラメーター合法性チェック
if (preg_match('/^\d+$/', $userId)) {
// データベースからデータをクエリします
$data = $db->query('SELECT * FROM users WHERE id = ?', [$userId]);
// クエリの結果をキャッシュに保存します
$cache->set($cacheKey, $data);
} else {
// 違法パラメーター,エラーメッセージを返します
$data = 'Invalid user ID';
}
}
コード例:
// ブルームフィルターライブラリを使用します
require_once 'bloom_filter.php';
// ブルームフィルターインスタンスを作成します
$bf = new BloomFilter();
// クエリ条件のハッシュ値をブルームフィルターに挿入します
$bf->add(hash('md5', $condition));
// ブルームフィルターにクエリ条件が存在するかどうかを判断する
if ($bf->contains(hash('md5', $condition))) {
// キャッシュからデータを取得します
$data = $cache->get($cacheKey);
} else {
// 違法パラメーター,エラーメッセージを返します
$data = 'Invalid condition';
}
コード例:
// キャッシュロックを取得します
$lockKey = 'cache_lock_' . $cacheKey;
if ($cache->add($lockKey, 1, 10)) {
// データベースをクエリします
$data = $db->query('SELECT * FROM hot_data WHERE id = ?', [$cacheKey]);
// クエリの結果をキャッシュに保存します,有効期限を設定します
$cache->set($cacheKey, $data, 60);
// キャッシュロックを放出します
$cache->delete($lockKey);
} else {
// 他のリクエストクエリの結果を待ちます
usleep(1000);
// キャッシュからデータを取得します
$data = $cache->get($cacheKey);
}