<article>
<h3>하나、소개</h3>
개발 중Web신청할 때,数据缓存是提高性能和响应速度的常用技术之하나。하지만,캐시 메커니즘의 특수성으로 인해,보안 문제가있을 수 있습니다。이 기사는 분석 할 것입니다PHP데이터 캐시의 보안,해당 보호 전략을 제공합니다。
<h3>둘、보안 분석</h3>
<ol>
<li><strong>캐시 침투</strong><br>
캐시 침투是指恶意用户通过构造恶意请求,캐시를 우회하고 데이터베이스를 직접 쿼리하십시오。하나般来说,캐시 시스템이 요청을 수신 한 후,먼저, 해당 데이터가 캐시에 존재하는지 확인하십시오.,존재하지 않는 경우,그런 다음 데이터베이스를 쿼리하고 결과를 캐시에 저장하십시오.。공격자는 결과가 캐시되지 않도록 쿼리 조건을 구성 할 수 있습니다.,따라서 데이터베이스는 매번 쿼리됩니다,데이터베이스에 과도한 압력을 유발합니다。
<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';
}
}
Code example:
// 블룸 필터 라이브러리 사용
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';
}
Code example:
// 캐시 잠금을 가져옵니다
$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);
}