Domanda

Recentemente ho trovato un enorme problema di sicurezza con il mio sistema PM che consente agli utenti di inviare un messaggio tanto quanto vogliono con un ciclo for nella barra degli indirizzi. Qualcuno ha messo questo nella barra degli indirizzi:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

E il messaggio è stato inviato a 1000 volte per me e la mia casella di posta era piena dello stesso messaggio e la mia base di dati era così pieno che phpMyAdmin stava comportando molto lag.

La mia domanda è, come posso impedirlo? Questo è un principale problema.

Inoltre, il modulo viene inviato con AJAX.

Modifica

Io uso PHP, così come posso evitare questo? Come come ho potuto fare al punto in cui un messaggio può essere inviato solo ogni 5 minuti o giù di lì e se presenta più di una entro 5 minuti verrà visualizzato un errore (o non mostrare alcun feedback degli utenti a tutti e solo smettere che venga presentata )?

È stato utile?

Soluzione

C'è un modo ovvio per risolvere il problema e il problema non si trova sul lato client -. si trova sul lato server

Lo script server non dovrebbe consentire l'invio di messaggi troppo spesso - ad es. Spesso, ad esempio, una volta ogni 10 minuti. Per farlo è possibile utilizzare il meccanismo sessione sul lato server e salvare le informazioni quando l'utente ha inviato l'e-mail. Se l'utente non ha inviato una e-mail, si dovrebbe anche salvare le informazioni in sessione -. Distinguere le persone con sessione attivate delle persone con sessione disabilitato (e si dovrebbe bloccare quest'ultimo di inviare messaggi di posta elettronica a tutti)

La sessione modo dovrebbe essere attuata (il codice specifico) dipende la lingua da utilizzare per lo scripting lato server (PHP, Python, JSP, ecc.).

Altri suggerimenti

Se qualcuno ha le conoscenze per fare questo a voi, probabilmente non può fare nulla sul lato client in modo da l'unica opzione direi è che si accede o di tenere un conteggio ecc del numero di richieste (forse per un particolare delle risorse) e rifiutare la richiesta (o inviare un "occupato" http codice, ecc) per l'utente specifico.

Penso che il modo più semplice sarebbe quella di contare le richieste da uno specifico indirizzo IP (questo ha ovviamente inconvenienti quali più utenti dietro un proxy o NAT, ecc).

La soluzione reale dipenderà dal vostro linguaggio lato server e web server, ma si potrebbe forse inquadrare una regola e vedere come funziona. Qualcosa come 5 richieste al minuto (o qualsiasi altra cosa è appropriato per il vostro uso) per ogni indirizzo IP.

Come altri hanno detto, è necessario implementare la protezione sul server. Nessuna quantità di client-side di codifica fornirà protezione.

Il modo più comune di proteggere un server contro questo tipo di abuso è chiamato rate limiting. Siete voi a decidere la frequenza con cui un determinato cliente per essere in grado di presentare un messaggio e si codifica il server di ignorare eventuali messaggi che non rientrano tale limite.

Ad esempio, si potrebbe decidere che non sarà più di un messaggio di un minuto e non più di due messaggi ogni 10 minuti e non più di quattro messaggi all'ora permettere. È possibile scegliere qualunque cosa tu pensi sembra ragionevole e il codice per tale algoritmo.

Nel vostro server, dovreste essere in grado di identificare l'utente che il messaggio proveniva da (molto probabilmente tramite un cookie di autenticazione) e nel database, dovreste essere in grado di sapere quando l'ultimo messaggio è stato inviato da quell'utente. Si può anche essere in grado di memorizzare nella cache che le informazioni nella RAM nel server (a seconda di come le tue opere di server) per evitare una ricerca nel database a ogni richiesta poiché è necessario solo per mantenere informazioni recenti e avete solo bisogno per ottimizzare le prestazioni sui recidivi ( quelli che stanno cercando di abusare del server e quindi proprio di recente ha inviato una richiesta).

Sono d'accordo con quello che tutti sta postando su rate-limiting.

Tuttavia, questo può essere molto complicato da implementare sul lato server. Soprattutto quando si inizia scaling out. E, onestamente, se 1000 messaggi ti facciano del male così male - il mio suggerimento potrebbe applicarsi al caso ancora di più.

Invece di implementare da soli, si consiglia di guardare in un servizio di terze parti di farlo per te, quali sono questi servizi web fresco super-delega Apigee

Una delle loro caratteristiche è, in particolare, la limitazione della velocità di API. (Vedi link)

entrare descrizione dell'immagine qui

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