Domanda

Qual è il modo migliore per impedire a bot, utenti malintenzionati, ecc. di eseguire script php troppo velocemente? Va bene se uso le funzioni usleep() o sleep() per fare semplicemente & Quot; niente & Quot; per un po '(poco prima dell'esecuzione del codice desiderato), o è semplicemente stupido e ci sono modi migliori per farlo?

Esempio:

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

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

Se ho appena messo, diciamo, usleep(3000000) prima dei codici di accesso e di disconnessione, va bene, o ci sono modi migliori e più saggi per raggiungere ciò che voglio ottenere?

modifica: in base ai suggerimenti seguenti, usleep o sleep provoca solo il disimpegno del processore dallo script corrente eseguito dall'utente corrente o lo fa causare disimpegnarsi da tutto il servizio? vale a dire se un utente + script invoca un <=> / <=>, anche tutti gli utenti + script simultanei verranno ritardati?

È stato utile?

Soluzione

Il modo in cui funziona la maggior parte dei server Web (ad esempio Apache) è quello di mantenere una raccolta di thread di lavoro. Quando viene eseguito uno script PHP, un thread esegue lo script PHP.

Quando lo script esegue sleep(100), l'esecuzione dello script richiede 100 secondi. Ciò significa che il thread di lavoro è collegato per 100 secondi.

Il problema è che hai un numero molto limitato di thread di lavoro - supponi di avere 10 thread e 10 persone di login - ora il tuo server web non può fornire ulteriori risposte ..

Il modo migliore per accedere con limiti di velocità (o altre azioni) è usare un qualche tipo di cosa veloce in memoria ( memcached è perfetto per questo), ma ciò richiede l'esecuzione di un processo separato ed è piuttosto complicato (potresti farlo se esegui qualcosa come Facebook ..).

Più semplice, potresti avere una tabella di database che memorizza user_id o ip_address, first_failed e failure_counter.

Ogni volta che ricevi un login fallito, tu (in pseudo codice) faresti:

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

Forse non è il più efficiente, e ci sono modi migliori, ma dovrebbe smettere abbastanza bene di forzare il bruto. L'uso di memcached è sostanzialmente lo stesso, ma il database viene sostituito con memcached (che è più veloce)

Altri suggerimenti

  

per bloccare bot, utenti malintenzionati, ecc.   dall'eseguire script php troppo velocemente?

Vorrei prima chiedere cosa stai davvero cercando di prevenire? Se si tratta di attacchi denial-of-service, allora dovrei dire che non c'è niente che puoi fare se sei limitato da ciò che puoi aggiungere agli script PHP. Lo stato dell'arte è molto al di là di ciò che noi programmatori possiamo proteggere. Inizia a guardare gli strumenti sysadmin progettati per questo scopo.

O stai cercando di limitare il tuo servizio in modo che le persone reali possano accedervi ma i robot non possono? Se è così, darei un'occhiata ad alcuni & Quot; captcha & Quot; tecniche.

O stai cercando di impedire agli utenti di eseguire il polling del tuo sito ogni secondo alla ricerca di nuovi contenuti? In tal caso, verificherei di fornire un feed RSS o un altro modo per avvisarli in modo che non consumino la tua larghezza di banda.

O è qualcos'altro?

In generale, direi che né sleep () né usleep () sono un buon metodo.

Il metodo suggerito costringerà TUTTI gli utenti ad attendere inutilmente prima di accedere.

La maggior parte dei server LAMP (e la maggior parte dei router / switch, in realtà) sono già configurati per prevenire attacchi Denial of Service. Lo fanno negando più richieste consecutive dallo stesso indirizzo IP.

Non vuoi dormire nel tuo php. Ciò ridurrà notevolmente il numero di richieste simultanee che il tuo servizio può gestire poiché avrai connessioni aperte in attesa.

La maggior parte dei server HTTP ha funzionalità che puoi abilitare per evitare gli attacchi DoS, ma in caso contrario dovresti semplicemente tenere traccia degli indirizzi IP che hai visto troppe volte di recente e inviare loro un 403 Proibito con un messaggio che chiede loro di aspettare un secondo.

Se per qualche motivo non puoi contare sul fatto che REMOTE_ADDR sia specifico dell'utente (tutti dietro lo stesso firewall, ecc.) potresti provare una sfida nel modulo di accesso e fare in modo che il browser remoto esegua un calcolo esteso su di esso (ad esempio, fattore un numero) che puoi verificare rapidamente sul lato server (con una rapida moltiplicazione).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top