웹 개발에서 사용자 요청 수를 제한하는 것은 시스템 보안 및 리소스 관리를 보장하기위한 주요 조치 중 하나입니다. 특히 악의적 인 공격을 방지 해야하는 일부 시나리오 (예 : 무차별 인력 균열, 크롤러 공격 등) 또는 API 요청의 빈도를 제어해야하므로 세션 요청 수를 제한하는 것이 특히 중요합니다. 이 기사에서는 PHP에서 SessionIdInterface를 사용하여 세션 요청 수를 제한하고 간단한 구현 방법을 제공하는 방법을 소개합니다.
SessionIdInterface 는 PHP 7.1+ 버전에서 도입 된 인터페이스로 세션을위한보다 유연한 관리 방법을 제공하기위한 인터페이스입니다. 개발자는 자체 세션 ID 생성 및 스토리지 메커니즘을 정의 할 수 있습니다. 이 인터페이스를 구현함으로써 개발자는 세션 ID가 생성되고 처리되는 방식을 사용자 정의하여 보안 제어에 더 많은 자유를 제공 할 수 있습니다.
세션 요청 수를 제한하는 것은 일반적으로 다음 상황을 방지하기위한 것입니다.
Brute Force Cracking : 암호를 자주 시도하여 악의적 인 사용자가 계정을 크래킹하는 것을 방지합니다.
크롤러 공격 : 빈번한 요청을 통해 자동화 도구가 서버 리소스를 소비하는 것을 방지합니다.
API 보호 : 인터페이스 남용 또는 DDOS 공격을 피하기 위해 빈번한 API 요청을 제한하십시오.
PHP에서 세션을 결합하면 세션 당 요청 수를 쉽게 제어 할 수 있습니다. 카운터를 설정하고 요구 사항에 따라 제한하여 각 세션에 대한 요청 수를 추적 할 수 있습니다.
이를 위해서는 먼저 세션 관리가 세션 ID가 생성되는 방법을 사용자 정의 할 수 있도록하고 동시에 세션을 사용하여 사용자 요청 수를 저장해야합니다. 아래는 특정 구현 단계를 소개합니다.
먼저 SessionIdInterface를 구현하기위한 사용자 정의 클래스를 작성 하고이 클래스를 통해 세션 ID가 생성 및 저장되는 방법을 제어하십시오. 우리는 PHP의 기본 세션 ID를 직접 사용하지 않지만 요구에 따라 생성합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">namespace</span></span><span> </span><span><span class="hljs-title class_">App</span></span><span>\</span><span><span class="hljs-title class_">Session</span></span><span>;
</span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">SessionHandlerInterface</span></span><span>;
</span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">SessionIdInterface</span></span><span>;
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">CustomSessionId</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionIdInterface</span></span><span>
{
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateId</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
{
</span><span><span class="hljs-comment">// 관습을 생성하십시오 Session ID</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-string">'session_'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">validateId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>)
{
</span><span><span class="hljs-comment">// 확인하다 Session ID 유효성</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^session_\w+$/'</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>);
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
위의 코드에서 GenerateID 메소드는 새 세션 ID를 생성하는 데 사용되며 ValidateID는 주어진 ID가 예상 형식을 충족하는지 확인하는 데 사용됩니다. 이 클래스를 통해 세션 ID의 생성 및 검증을 제어하여 각 세션이 고유한지 확인할 수 있습니다.
다음으로 PHP 세션을 열고 $ _session 배열을 사용하여 사용자의 요청 수를 저장하십시오.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</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-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'request_count'</span></span><span>])) {
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'request_count'</span></span><span>] = </span><span><span class="hljs-number">0</span></span><span>;
}
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'request_count'</span></span><span>]++;
</span><span><span class="hljs-comment">// 한도를 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$maxRequests</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'request_count'</span></span><span>] > </span><span><span class="hljs-variable">$maxRequests</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">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 정상적인 비즈니스 논리를 계속 실행하십시오</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">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'request_count'</span></span><span>];
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 코드에서는 먼저 request_count가 존재하는지 확인하고 그렇지 않은 경우 0으로 초기화합니다. 각 요청에서 카운터가 1 만 증가합니다. 요청 수가 설정 최대 값을 초과하면 시스템이 프롬프트를 출력하고 실행을 종료합니다.
장기 사용 중에 사용자의 요청이 제한없이 증가하지 않기 위해 세션이 만료되거나 특정 조건이 충족되면 카운터를 지울 수 있습니다. 세션 만료 시간을 설정하면 세션 카운트가 일정 시간 후에 자동으로 재설정 될 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 설정 Session 만료 시간입니다 10 분</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'session.gc_maxlifetime'</span></span><span>, </span><span><span class="hljs-number">600</span></span><span>); </span><span><span class="hljs-comment">// 600 두번째</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'last_request_time'</span></span><span>])) {
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'last_request_time'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>();
}
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">time</span></span><span>() - </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'last_request_time'</span></span><span>] > </span><span><span class="hljs-number">600</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">session_destroy</span></span><span>(); </span><span><span class="hljs-comment">// 세션이 만료됩니다,세션을 파괴하십시오</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">exit</span></span><span>;
}
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'last_request_time'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 코드는 세션 만료 제어를 구현합니다. 세션이 10 분을 초과하고 요청이 없으면 세션이 자동으로 파괴되고 사용자 세션이 만료되었습니다.
위의 방법을 통해 SessionIdInterface를 사용하여 PHP에서 세션 ID를 사용자 정의하고 세션 스토리지를 사용하여 요청 수를 제한 할 수 있습니다. 간단한 코드 구현을 통해 사용자 경험을 보장하면서 악의적 인 요청을 효과적으로 방지하고 시스템의 보안을 향상시킬 수 있습니다.
이 기사의 실용 가이드가 귀하에게 도움이되며 개발 과정에서 대화를 더 잘 관리하고 요청을 제한하는 데 도움이되기를 바랍니다.