<article>
<h3>un、introduction</h3>
En développementWebLors de l'application,数据缓存是提高性能和响应速度的常用技术之un。Cependant,En raison de la particularité du mécanisme de cache,Il peut y avoir des problèmes de sécurité。Cet article analyseraPHPSécurité du cache de données,et fournir des stratégies de protection correspondantes。
<h3>deux、Analyse de la sécurité</h3>
<ol>
<li><strong>Pénétration du cache</strong><br>
Pénétration du cache是指恶意用户通过构造恶意请求,Contourner le cache et interroger la base de données directement。un般来说,Une fois que le système de cache a reçu la demande,Tout d'abord, vérifiez si les données correspondantes existent dans le cache,S'il n'existe pas,Puis interrogez la base de données et stockez les résultats dans le cache。Les attaquants peuvent construire des conditions de requête afin que les résultats ne soient jamais mis en cache,Par conséquent, la base de données sera interrogée à chaque fois,Provoquant une pression excessive sur la base de données。
<br>Solution:Avant d'interroger la base de données,Le chèque de légalité peut être effectué sur les paramètres demandés,Vérifiez la légalité des demandes des utilisateurs。Par exemple,Pour les utilisateursID,Des expressions ou des filtres réguliers peuvent être utilisés pour limiter,Exclure l'exception ou les paramètres illégaux。</li>
</ol>
<p>Exemple de code:</p>
<div class="container">
<pre>
<code>
// Traduire l'utilisateurIDComme un cacheKey
$cacheKey = 'user_' . $userId;
// Déterminez s'il existe des données dans le cache
if ($cache->exists($cacheKey)) {
// Obtenez des données de Cache
$data = $cache->get($cacheKey);
} else {
// Vérification de la légalité des paramètres
if (preg_match('/^\d+$/', $userId)) {
// Remettre en question les données de la base de données
$data = $db->query('SELECT * FROM users WHERE id = ?', [$userId]);
// Enregistrer les résultats de la requête dans le cache
$cache->set($cacheKey, $data);
} else {
// Paramètres illégaux,Renvoyer un message d'erreur
$data = 'Invalid user ID';
}
}
Exemple de code:
// Utilisation de la bibliothèque de filtre Bloom
require_once 'bloom_filter.php';
// Créer une instance de filtre Bloom
$bf = new BloomFilter();
// Insérez la valeur de hachage de la condition de requête dans le filtre Bloom
$bf->add(hash('md5', $condition));
// Déterminez si la condition de requête existe dans le filtre Bloom
if ($bf->contains(hash('md5', $condition))) {
// Obtenez des données de Cache
$data = $cache->get($cacheKey);
} else {
// Paramètres illégaux,Renvoyer un message d'erreur
$data = 'Invalid condition';
}
Exemple de code:
// Obtenez le verrouillage du cache
$lockKey = 'cache_lock_' . $cacheKey;
if ($cache->add($lockKey, 1, 10)) {
// Interroger la base de données
$data = $db->query('SELECT * FROM hot_data WHERE id = ?', [$cacheKey]);
// Enregistrer les résultats de la requête dans le cache,Et définir le temps d'expiration
$cache->set($cacheKey, $data, 60);
// Libérez le verrouillage du cache
$cache->delete($lockKey);
} else {
// Attendez les autres résultats de la requête de demande
usleep(1000);
// Obtenez des données de Cache
$data = $cache->get($cacheKey);
}