2010-03-28 10 views
7

¿Cómo se puede pasar de forma segura la información de la tarjeta de crédito entre páginas en PHP? Estoy construyendo una aplicación de comercio electrónico y me gustaría tener los usuarios a pasar por la caja como esta:Cómo pasar de forma segura la información de la tarjeta de crédito entre páginas en PHP

Introduzca la información -> Revisión -> Finalizar Orden

El problema es que no estoy seguro de cómo de manera segura Pasar la información de crédito desde cuando el usuario los ingresa cuando la proceso (en el paso Finalizar pedido). Escuché que usar sesiones es inseguro, incluso con encriptación.

¡Cualquier ayuda sería apreciada!

+1

Esto es solo una mala idea. Tendría que manejar el mayor riesgo de ningún beneficio real. La pasarela de pago puede confirmar los números de la tarjeta de crédito de todos modos, los datos de la sesión están abiertos al ataque y la representación de números CC en la pantalla puede significar que se almacenan en caché en algún lugar. – Rimian

+0

Combina la información de confirmación y pago en la misma página. –

Respuesta

1

Bueno, primero debe usar el protocolo HTTPS para asegurarse de que la conexión esté encriptada.

Después de eso, puede almacenar los datos en el $_SESSION superglobal. Los datos se almacenan en sus servidores, por lo que es relativamente seguro.

Puede hacer una técnica similar donde inserta la información en una base de datos de pedidos, donde la clave es un GUID o algo bastante aleatorio y único. Luego, cuando la persona va a modificar/revisar su orden, usted debe tener el ID del pedido almacenado en la parte GET de la URL (o si usted es paranoico, a/variable de cookie de sesión):

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

Para proporcione seguridad adicional, también puede almacenar una dirección IP en la tabla de pedidos y asegurarse de que coincidan la dirección IP y la ID del pedido.

+0

Estoy tratando de no almacenar la información en mi servidor si es posible – Alex

+2

@Alex la página de confirmación se solicita del servidor. ¿Dónde más vas a almacenarlo? ¿Lado del cliente? – Rimian

+8

Esto es una violación de PCI-DSS porque $ _SESSION escribirá los datos en el disco duro en texto sin formato. – rook

0

No es mi área de especialización, pero creo que desea almacenarla en una sesión pero también usar una "ficha sincronizada" (o lo que los niños llaman en estos días) para ayudar a evitar los ataques de CSRF.

Por supuesto, usted quiere estar usando https (correctamente), evitando de datos sensibles en la URL y campos ocultos, evitando poner la información muy sensible en cualquier respuesta en absoluto, etc., etc.

10

I wouldn' t almacenarlo en cualquier lugar. Es demasiado riesgo y probablemente no es ético.

Envíe una solicitud a la pasarela de pago publicando un formulario sobre https y almacenando únicamente el resultado de la transacción.

Probablemente solo le importe si la transacción fue aprobada o rechazada. A quién le importa cuál es el número?

+0

Me inclino a estar de acuerdo con el punto aquí que, si intentas no almacenar la información de la tarjeta (lo cual no es una mala idea), cualquier script PHP que uses para procesar el formulario de envío de información de pago solo debe reenviar información en la pasarela de pago o donde sea que deba ir. Esto significa que la información de la tarjeta de crédito debe ser lo último que solicite como parte del proceso de pago. –

+1

+1, es común revisar el orden antes de ingresar CC info. La lógica de negocios aquí es simplemente al revés. –

+2

En realidad, muchos sitios (incluyendo amazon, newegg) tienen una página de revisión/confirmación después de ingresar su información para asegurarse de poner la información CORRECTA de envío/facturación – Alex

8

No guarde la información de la tarjeta de crédito en la sesión, no la almacene en una base de datos, no la almacene en un archivo. En su lugar, vuelva a escribir la información de cc en la página de revisión en las entradas de html ocultas.

lo tanto, el flujo del programa sería el siguiente: el pago mensajes

  1. de usuario y la información de facturación al servidor a través de un formulario HTML.
  2. El servidor verifica que esta información tenga el formato correcto (es decir, la tarjeta de crédito tiene el número apropiado de dígitos, se ingresó una dirección de facturación, etc.)
  3. Después de la verificación, el servidor devuelve toda la información enviada como formulario oculto campos de entrada. Esto incluye la dirección de facturación, la dirección de envío y la información de la tarjeta de crédito.
  4. El formulario en la página de revisión (con los campos de entrada ocultos) tiene un botón etiquetado "Finalizar pedido"/"Completar pedido". Este formulario de revisión se publica en el guión de orden finalizado.
  5. El script de finalización almacena información de facturación/envío en su base de datos y envía la información de la tarjeta de crédito a su pasarela de pago.

Las ventajas de este método son de dos tipos:

  1. Se ahorra los gastos generales y el costo de cumplimiento de PCI adicional que se requiere cuando se almacena información de crédito.
  2. Este método se mantiene dentro de los límites de seguridad del protocolo SSL. Es decir, la información cifrada de la tarjeta de crédito deberá enviarse a su servidor en cualquier instancia; este método continúa dependiendo únicamente de la eficacia de SSL, sin introducir las complejidades de los datos persistentes de la tarjeta de crédito.

Este último punto plantea otra preocupación: al tener una página de revisión, se duplica la cantidad de veces que se transmiten los datos de la tarjeta de crédito cifrada a través de la red. Con este método hay 4 transmisiones como mínimo: de cliente a servidor, de servidor a cliente, de cliente a servidor (nuevamente) y de servidor a puerta de enlace. Sin revisión, hay 2 transmisiones como mínimo: de cliente a servidor y de servidor a puerta de enlace. ¿La conveniencia de una página de revisión vale la pena el riesgo de transmisiones adicionales? Esa es una decisión que usted, como desarrollador web (y su cliente) tiene que hacer.

+0

Estaba pensando eso, pero ¿debería hacer algún tipo de encriptación del lado del servidor en la información de la tarjeta de crédito antes de escribirlos como campos de entrada ocultos? Si es así, ¿cómo debería abordar este método? ¿Firmarlo digitalmente? – Alex

+2

Con este método, no almacenaría la información de cc en ningún lugar del servidor, por lo que podrá confiar en el cifrado SSL para transmitir los datos de CC al servidor. – leepowers

+0

Tengo curiosidad por saber si la información del cc en un formulario oculto puede técnicamente almacenarse en un navegador y almacenarse en un archivo de caché temporal en el disco duro del usuario. ¿Alguna manera de prevenir esto? Quizás uno debería generar una clave aleatoria y almacenarla en la sesión, y luego usar esa clave para cifrar la información de cc en el campo de formulario oculto. Una vez que se publica la página de revisión, se puede usar la clave de sesión para descifrar el valor y pasarlo al procesador de la tarjeta de crédito ... – stereoscott

0

Creo que tendré que estar de acuerdo. Almacenar números de tarjetas de crédito es un riesgo demasiado grande y las consecuencias podrían ser exageradas.

La forma ideal sería pasar la información a un procesador de terceros y simplemente usar el resultado devuelto para moldear la lógica del script.

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

Esperanza usted consigue el punto ... :)

1

Una alternativa es utilizar un servicio de pago como el perfil Authorize.net's Customer Information Manager (hay otros también). Usted almacena la información de pago en un perfil a través de su API, luego usa la identificación del perfil cuando realmente carga la tarjeta. De esta manera, nunca almacenarás los datos en tus servidores.

Cuestiones relacionadas