문제

PHP 스크립트를 너무 빨리 실행하여 봇, 악의적 인 사용자 등을 중지하는 가장 좋은 방법은 무엇입니까? 내가 사용해도 괜찮습니까? usleep() 또는 sleep() 한동안 "아무것도"하지 않기 전에 (원하는 코드가 실행되기 직전) 단순히 "아무것도"하지 않거나, 그보다 어리석은 일이며 더 좋은 방법이 있습니까?

예시:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

내가 방금 넣으면 usleep(3000000) 로그인 및 로그 아웃 코드 전에, 내가 달성하고자하는 것을 달성하는 더 현명한 방법이 있습니까?

편집하다: 아래의 제안을 바탕으로합니다 usleep 또는 sleep 프로세서가 현재 사용자가 실행중인 현재 스크립트에서 분리되거나 전체 서비스에서 분리 되나요? 즉 하나의 사용자+스크립트가 호출되는 경우 a sleep/usleep, 모든 동시 사용자+스크립트도 지연됩니까?

도움이 되었습니까?

해결책

대부분의 웹 서버가 작동하는 방식 (예 : Apache)은 작업자 스레드 모음을 유지하는 것입니다. PHP 스크립트가 실행되면 하나의 스레드가 PHP 스크립트를 실행합니다.

스크립트가 할 때 sleep(100), 스크립트는 실행하는 데 100 초가 걸립니다. 즉, 작업자 스레드가 100 초 동안 묶여 있음을 의미합니다.

문제는, 당신은 매우 유한 한 수의 작업자 스레드를 가지고 있다는 것입니다. 10 개의 스레드가 있고 10 명이 로그인한다고 말합니다. 이제 웹 서버가 추가 응답을 제공 할 수 없습니다 ..

제한 로그인 (또는 기타 조치)을 평가하는 가장 좋은 방법은 일종의 빠른 메모리 저장소를 사용하는 것입니다 (memcached 이것에 적합하지만 별도의 프로세스를 실행해야하며 매우 복잡합니다 (Facebook과 같은 것을 실행하면이 작업을 수행 할 수 있습니다.).

더 간단하게, 저장하는 데이터베이스 테이블을 가질 수 있습니다. user_id 또는 ip_address, first_failed 그리고 failure_counter.

로그인에 실패 할 때마다 (의사 코드) 귀하는 다음을 수행합니다.

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

어쩌면 가장 효율적이지 않고 더 나은 방법이 있지만 무차별 대결을 잘 막아야합니다. MemCached 사용은 기본적으로 동일하지만 데이터베이스는 MemCached로 대체됩니다 (더 빠릅니다)

다른 팁

PHP 스크립트를 너무 빠르게 실행하는 봇, 악의적 인 사용자 등을 중지하려면?

먼저 당신이 실제로 무엇을 막으려 고하는지 물어볼 것입니까? 그것이 서비스 거부 공격이라면, 당신이 PHP 스크립트에 추가 할 수있는 것에 의해 제한되어 있다면 할 수있는 일이 없다고 말해야합니다. 최신 기술은 프로그래머가 보호 할 수있는 것보다 훨씬 뛰어납니다. 이 목적을 위해 설계된 Sysadmin 도구를 살펴보십시오.

아니면 실제 사람들이 액세스 할 수 있지만 봇은 할 수 없도록 서비스를 제한하려고합니까? 그렇다면, 나는 "Captcha"기술을 살펴 봅니다.

아니면 사용자가 새로운 콘텐츠를 찾기 위해 매 초마다 사이트를 폴링하는 것을 방지하려고합니까? 그렇다면 RSS 피드 제공 또는 대역폭을 먹지 않도록 RSS 피드를 제공하는 것을 조사합니다.

아니면 다른 것입니까?

일반적으로, 나는 수면 ()이나 usleep ()가 좋은 방법이라고 말하고 싶습니다.

제안 된 방법은 모든 사용자가 로그인하기 전에 불필요하게 대기하도록 강요합니다.

대부분의 램프 서버 (및 대부분의 라우터/스위치)는 이미 서비스 거부 공격을 방지하도록 구성되어 있습니다. 동일한 IP 주소에서 여러 연속 요청을 거부하여이를 수행합니다.

PHP에서 잠을 자고 싶지 않습니다. 그렇게하면 연결이 열리기 때문에 서빙이 처리 할 수있는 동시 요청 수를 크게 줄일 수 있습니다.

대부분의 HTTP 서버에는 DOS 공격을 피할 수있는 기능이 있지만 최근에 너무 많은 시간을 보았던 IP 주소를 추적하고 잠시 기다리는 메시지와 함께 403을 보내야합니다.

어떤 이유로 든 remote_addr가 사용자별로 구체적으로 계산할 수없는 경우 (동일한 방화벽의 모든 사람) 로그인 양식에서 도전을 입증하고 원격 브라우저가 확장 된 계산을 수행 할 수 있습니다 (예 : 숫자 숫자를 계산할 수 있습니다. ) 서버 측을 신속하게 확인할 수 있습니다 (빠른 곱셈으로).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top