2010-03-28 10 views
7

Come si trasferiscono in modo sicuro le informazioni della carta di credito tra le pagine in PHP? Sto costruendo un'applicazione e-commerce e mi piacerebbe avere gli utenti di passare attraverso la cassa in questo modo:Come passare in sicurezza le informazioni della carta di credito tra le pagine in PHP

Enter Informazioni -> Recensione -> Finalizza Order

Il problema è che non sono sicuro su come in modo sicuro passare le informazioni sul credito da quando l'utente le immette nel momento in cui l'elabora (alla fase Finalize Order). Ho sentito che usare le sessioni non è sicuro, anche con la crittografia.

Qualsiasi aiuto sarebbe apprezzato!

+1

Questa è solo una cattiva idea. Dovresti gestire l'aumento del rischio senza alcun beneficio reale. Il gateway di pagamento può confermare comunque i numeri di carta di credito, i dati di sessione sono aperti per attaccare e il rendering dei numeri CC sullo schermo può significare che vengono memorizzati nella cache da qualche parte. – Rimian

+0

Unire le informazioni di conferma e di pagamento sulla stessa pagina. –

risposta

1

Bene, per prima cosa dovresti utilizzare il protocollo HTTPS per garantire che la connessione sia crittografata.

Dopo questo, è possibile memorizzare i dati nel $_SESSION super-globale. I dati sono memorizzati sui tuoi server, quindi è relativamente sicuro.

Si potrebbe eseguire una tecnica simile in cui si inseriscono le informazioni in un database degli ordini, in cui la chiave è un GUID o qualcos'altro abbastanza casuale e unico. Poi, quando la persona va a modificare/rivedere il loro ordine, si dovrebbe avere l'Ordine ID memorizzato nella parte GET di URL (o se sei paranoico, un cookie/variabile di sessione):

https://example.com/order?orderID=akjgflkhaslasdfkjhalsdjkljahs 

Per fornire ulteriore sicurezza, è anche possibile memorizzare un indirizzo IP nella tabella degli ordini e assicurarsi che l'IP e l'ID ordine corrispondano.

+0

Sto tentando di non memorizzare le informazioni sul mio server, se possibile – Alex

+2

@Alex, la richiesta di conferma viene richiesta dal server. Dove altro hai intenzione di conservarlo? Dalla parte del cliente? – Rimian

+8

Questa è una violazione di PCI-DSS perché $ _SESSION scriverà i dati sul disco rigido in testo normale. – rook

0

Non è la mia area di competenza, ma penso che si voglia archiviarlo in una sessione ma anche utilizzare un "token sincronizzato" (o quello che i bambini chiamano in questi giorni) per evitare gli attacchi CSRF.

Naturalmente, si vuole essere con https (correttamente), evitando i dati sensibili nel URL e campi nascosti, evitare di mettere le informazioni molto sensibili a qualsiasi risposta a tutti, ecc, ecc

10

I wouldn' t memorizzarlo ovunque. È troppo rischioso e probabilmente non etico.

Inviare una richiesta al gateway di pagamento pubblicando un modulo su https e memorizzare solo il risultato della transazione.

Probabilmente ti interessa solo se la transazione è stata approvata o rifiutata. A chi importa quale sia il numero?

+0

Sono propenso a concordare con il punto fatto qui che, se stai cercando di non memorizzare le informazioni della carta (che non è una cattiva idea), qualunque script PHP tu usi per elaborare il modulo di invio delle informazioni di pagamento dovrebbe semplicemente inoltrare informazioni sul gateway di pagamento o dovunque debba andare. Ciò significa che i dati della carta di credito devono essere l'ultima cosa che chiedi come parte del processo di checkout. –

+1

+1, è comune rivedere l'ordine _prima_ inserendo informazioni CC. La logica aziendale qui è solo all'indietro. –

+2

In realtà, molti siti (tra cui Amazon, Newegg) hanno una pagina di revisione/conferma dopo aver inserito le tue informazioni per essere sicuro di inserire le corrette informazioni di spedizione/fatturazione – Alex

8

Non archiviare le informazioni della carta di credito nella sessione, non memorizzarle in un database, non memorizzarle in un file. Invece, scrivi le informazioni cc alla pagina di revisione in un input html nascosto.

Così il flusso del programma funzionerebbe in questo modo:

  1. utente i messaggi di pagamento e informazioni di fatturazione al server tramite un form HTML.
  2. Server verifica che questa informazione sia nel formato corretto (ad esempio, la carta di credito ha il numero appropriato di cifre, è stato inserito un indirizzo di fatturazione, ecc.)
  3. Dopo la verifica il server scrive tutte le informazioni inviate come modulo nascosto campi di input. Questo include indirizzo di fatturazione, indirizzo di spedizione e informazioni sulla carta di credito.
  4. Il modulo nella pagina di revisione (con i campi di input nascosti) ha un pulsante con l'etichetta "Fine ordine"/"Ordine completo". Questo modulo di revisione pubblica lo script dell'ordine finalizzato.
  5. Lo script di finalizzazione memorizza le informazioni di fatturazione/spedizione nel database e invia le informazioni della carta di credito al gateway di pagamento.

I vantaggi di questo metodo sono duplici:

  1. Si salva il sovraccarico e il costo della conformità PCI addizionale che è necessario per memorizzare informazioni di credito.
  2. Questo metodo rimane entro i limiti di sicurezza del protocollo SSL. Ciò significa che le informazioni della carta di credito crittografate dovranno essere inviate al tuo server in ogni caso: questo metodo continua a basarsi esclusivamente sull'efficacia di SSL, senza introdurre la complessità dei dati persistenti della carta di credito.

Quest'ultimo punto solleva un'altra preoccupazione: avendo una pagina di revisione si raddoppia il numero di volte in cui i dati della carta di credito crittografata vengono trasmessi attraverso la rete. Con questo metodo ci sono 4 cambi minimi: da client a server, da server a client, da client a server (di nuovo) quindi da server a gateway. Senza revisione ci sono 2 cambi minimi: da client a server e da server a gateway. La praticità di una pagina di revisione vale il rischio di trasmissioni aggiuntive? È una decisione che tu come sviluppatore web (e il tuo cliente) devi prendere.

+0

Ci stavo pensando, ma dovrei fare una specie di crittografia lato server sulle informazioni della carta di credito prima di scriverle come campi di input del modulo nascosto? In tal caso, come devo affrontare questo metodo? Firmare digitalmente? – Alex

+2

Con questo metodo non si memorizzano le informazioni cc da nessuna parte sul server, quindi sarà possibile fare affidamento sulla crittografia SSL per trasmettere i dati cc al/dal server. – leepowers

+0

Sono curioso di sapere se avere le informazioni cc in un modulo nascosto potrebbe tecnicamente essere memorizzato nella cache da un browser e memorizzato in un file di cache temporaneo sul disco rigido dell'utente. Ad ogni modo per impedirlo? Forse si dovrebbe generare una chiave casuale e memorizzarla nella sessione, e quindi usare quella chiave per crittografare le informazioni cc nel campo del modulo nascosto. Una volta pubblicata la pagina di revisione, è possibile utilizzare la chiave di sessione per decodificare il valore e trasferirlo al processore della carta di credito ... – stereoscott

0

Penso che dovrò essere d'accordo. Memorizzare i numeri delle carte di credito è un rischio troppo grande e le conseguenze potrebbero essere esagerate.

Il modo ideale sarebbe passare le informazioni a un processore di terze parti e utilizzare solo il risultato restituito per plasmare la logica di script.

if (transaction){ 
    // code goes here 
} 
else{ 
    // code goes here 
} 

auguro che si ottiene il punto ... :)

1

Un'alternativa è quella di utilizzare un servizio di profilo di pagamento come Authorize.net's Customer Information Manager (ce ne sono anche altri). Memorizzi le informazioni di pagamento in un profilo tramite la loro API, quindi utilizza l'ID profilo quando addebita effettivamente la carta. In questo modo non memorizzerai mai i dati sui tuoi server.

Problemi correlati