2013-06-20 15 views
9

Abbiamo server di hosting condiviso che utilizzano PHP fastcgi (su IIS) per diversi client (hosting condiviso). Normalmente i clienti usano un vecchio codice sfruttabile che causa buchi nelle loro applicazioni che alla fine viene utilizzato dagli hacker per installare codice dannoso. La maggior parte delle volte questo codice viene utilizzato per inviare spam dai nostri server.Come limitare la posta SMTP in uscita inviata da PHP

Non abbiamo alcun controllo sul codice dei nostri clienti, quindi l'applicazione delle patch ai fori è praticamente impossibile.

Vorremmo tuttavia bloccare i client che inviano spam quando inviano più di X messaggi di posta elettronica in quantità di tempo Y.

L'installazione è basata su fastcgi, quindi c'è poca relazione tra php e il server web. PHP invia la sua posta tramite SMTP su localhost. Il server di posta consente l'inoltro di tutte le connessioni localhost (ovviamente).

Una cosa che mi passa per la testa è l'impostazione di una variabile di ambiente contenente un identificatore nell'ambiente fastcgi e l'utilizzo dell'opzione file antefatto di php per aggiungere un'intestazione a tutta la posta inviata dal mailer di php. Successivamente, potremmo usare quell'intestazione della posta per identificare il colpevole dello spamming.

L'opzione di cui sopra non si prenderà mai cura degli script di spam utilizzando telnet (telnet localhost, HELO, MAIL FROM, ecc.) Durante l'invio di e-mail.

La mia domanda: è l'idea che ho menzionato la migliore e forse unica opzione per affrontare il nostro problema? O ci sono soluzioni migliori per questa situazione? E se è così, per favore spiega come affronterai il problema.

+3

Non sono sicuro se si tratta di una domanda di programmazione, si potrebbe ottenere una risposta migliore su http://serverfault.com/ – Pitchinnate

+0

Anche io ero in dubbio. Semplicemente non sono sicuro se la soluzione sarebbe sul lato PHP, la fine del server smtp o entrambi .. Beh, probabilmente entrambi. Penso che uno abbia bisogno della conoscenza di entrambi e mi aspetto che più programmatori PHP abbiano conoscenza del server, e viceversa. Se non riesco a ottenere risposte qui, però, chiedo il passaggio a serverfault. –

risposta

1

Come previsto, Stack Overflow non è il posto giusto per questa domanda. Le risposte fornite non espongono alcun metodo chiaro per identificare le connessioni delle sessioni FastCGI al server MTA (SMTP).

Vado con il mio concetto iniziale di aggiunta di un identificatore all'ambiente di php. Questo identificatore può essere letto nel file antefatto di PHP utilizzando la funzione getenv(). Questo identificatore può quindi essere aggiunto alle intestazioni di posta per la posta in uscita.

Inoltre, ho abilitato l'impostazione mail.add_x_header ini che consente di identificare quale script ha causato l'esecuzione dello spam.

lascio la questione aperta per tutta la durata di taglie, sperando altre opzioni apparirà magicamente :)

+0

Il file Prepend (e la soluzione del codice PHP in generale) non è molto semplice e facile da manipolare. Meglio è con i valori ini. Configura il tuo wrapper FCGI per impostare queste impostazioni ini in base all'ambiente. So che questo funziona bene su sistemi Linux e tecnicamente non vedo alcun motivo per non fare lo stesso su Windows. – hakre

+0

Meglio ancora, fai questa domanda su serverfault.com. Questa è una domanda di amministratore di sistema. – Cypher

+1

Questo era già stato suggerito. Il fatto è che la soluzione potrebbe anche richiedere un sacco di php così come la configurazione lato server. Mi aspetto che più programmatori di php conoscano le attività di sysadmin, quindi gli amministratori di sistema conoscono php. Tuttavia, la domanda è già stata contrassegnata con una richiesta di spostamento su server default –

2

La maggior parte degli host condivisi blocca l'uso della funzione mail() di PHP, in quanto può essere facilmente sfruttata. Invece consigliano di utilizzare sendmail o script simili che richiedono l'autenticazione SMTP prima di inviarli. Supponendo che non lo stiate già facendo, una volta implementato, dovreste essere in grado di tenere traccia del numero di e-mail inviate da un determinato dominio/account e-mail e porre delle restrizioni su di esso.

+0

Capisco la tua soluzione. La chiave di questo è lo smtp autenticato, ma considerando il fatto che abbiamo un bel po 'di utenti e codice esistente sui nostri server, non abbiamo la possibilità di costringere quegli utenti a modificare il loro codice. (Beh, potremmo, ma probabilmente significherebbe un banco di supporto molto impegnato). La soluzione deve essere senza impatto per i nostri clienti. –

4

È possibile filtrare ciò su MTA (agente di trasferimento messaggi). Ad esempio, consentirà non più di 50 messaggi di posta elettronica in 1 ora per ogni utente in Exim (http://www.exim.org) file di configurazione (/etc/exim/exim.conf):

begin acl 

acl_check_not_smtp: 
warn ratelimit = 0/1h/strict/$sender_address_local_part 
log_message = Sender rate $sender_rate/$sender_rate_perio 

acl_not_smtp = acl_not_smtp 
begin acl 
acl_not_smtp: 
     deny message = Sender rate overlimit - $sender_rate/$sender_rate_period 
     ratelimit = 50/1h/strict 
     accept 

E non importa quanto tentano di inviare, via posta php() o altro metodo.

+1

Diversi server smtp hanno quell'impostazione sì, ma tutto si riduce alla conoscenza dell'utente. Quando gli utenti inviano tramite smtp non autenticato su localhost, non esiste un modo ovvio per dire quale utente sta inviando le e-mail. Potrebbe ancora essere fatto consentendo solo gli indirizzi e-mail noti in "Da", ma potrebbe essere facilmente falsificato e complicherebbe le cose per i clienti che utilizzano i nostri server come webhost mentre usano i propri server di posta dell'ufficio (continuando a inviare la posta dalla loro indirizzo "ufficio" nel campo Da) –

+0

Hai qualche software che ti permette di gestire i tuoi clienti? Voglio dire, usi CPanel (http://cpanel.net) o qualcosa del genere? CPanel, ad esempio, ha le impostazioni per fare ciò che ti serve: http://docs.cpanel.net/twiki/bin/view/AllDocumentation/WHMDocs/TweakSettings#Mail. Se non si utilizza alcun sistema per gestire i client, è possibile provare a farlo direttamente sul firewall. – ToxaBes

+0

Ma come si tratterebbe questo con le connessioni localhost che non sono smtp autenticati? Non riesco a imporre l'autenticazione SMTP autenticata, poiché ciò avrebbe un impatto sugli utenti esistenti. –

2

Va bene, bastone con me su questo. Non l'ho implementato ma sembra buono.

Il concetto è che si potrebbe

  1. eseguire un file php prima di ogni pagina del tuo sito i clienti
  2. in quel file php rinominare la funzione mail a mail_internal().
  3. in tale php creare una nuova funzione chiamata posta per fare il vostro controllo/verifica che il vostro cliente è autorizzato a inviare posta, e se sono chiamare la funzione mail_internal() con gli stessi parametri.

Si dovrà installare l'estensione PECL runkit http://us.php.net/manual/en/runkit.installation.php

Modifiche

in php.ini

auto_prepend_file /var/www/allclients_forcedfile.php 

in /var/www/allclients_forcedfile.php

runkit_function_rename ("mail" , "mail_internal"); 
function mail ( $to , $subject , $message, $additional_headers = "", $additional_parameters ="") 
{ 
    $args = func_get_args(); 
    error_log("mail_internal : $_SERVER[HTTP_HOST] : ".implode(" : ",$args)); 
    //lookup whether you want to send more mail for this client maybe by keeping a counter in some file in the $SERVER[DOCUMENT_ROOT] 
    if($sendmoremail) 
      return mail_internal ( $args[0], $args[1] , $args[2], $args[3] , $args[4] ); 
    return false; 
} 
+0

Sai, in realtà non ci avevo pensato. Anche se devo ancora provare questo sul nostro ambiente Windows (non sono sicuro se l'estensione del runkit esiste per Windows, ma è un pensiero interessante. + 1 in ogni caso. Proverò questo. –

+0

Mi piacerebbe sentire se Funziona, usando questo posso immaginare una libreria molto interessante che estende molte funzioni incorporate per dare agli host il controllo su di esse –

Problemi correlati