# Guía sobre seguridad de la integración Garantiza el cumplimiento de la normativa PCI y protege las comunicaciones entre el cliente y el servidor. El [Estándar de Seguridad de los Datos de la Industria de la Tarjeta de Pagos](https://www.pcisecuritystandards.org/pci_security/) (PCI DSS) es el estándar mundial de seguridad para todas las entidades que almacenan, procesan o transmiten datos confidenciales o datos del titular de tarjeta. El PCI DSS establece un nivel básico de protección para los consumidores y ayuda a reducir el fraude y las filtraciones de datos en todo el ecosistema de pagos. Toda persona que intervenga en el procesamiento, la transmisión o el almacenamiento de datos de tarjetas debe cumplir con la normativa PCI DSS. ## Validar el cumplimiento de la normativa PCI El cumplimiento de la normativa PCI es una responsabilidad compartida y se aplica tanto a tu Stripe como a tu empresa: - Stripe cuenta con la certificación anual de un auditor certificado en seguridad (QSA) independiente como Proveedor de servicios [de nivel 1 de la normativa PCI](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe,%20inc) que cumple con todos los requisitos de PCI. - Como empresa que acepta pagos, debes hacerlo cumpliendo con la normativa PCI y dar fe de ello anualmente. Revisa los requisitos de documentación para tu empresa en tu [Dashboard](https://dashboard.stripe.com/settings/compliance/documents) y continúa leyendo esta guía para saber cómo Stripe puede ayudarte a cumplir con la normativa PCI. ## Usa integraciones de bajo riesgo Algunos modelos de empresa requieren la admisión de PAN no tokenizados en una página de pago. Si tu empresa maneja datos confidenciales de tarjetas de crédito directamente cuando acepta pagos, es posible que debas cumplir con más de 300 controles de seguridad en la normativa PCI DSS. Esto podría requerir que compres, implementes y mantengas software y hardware de seguridad dedicados, y contrates auditores externos como soporte para tus requisitos de evaluación anual. Muchos modelos de negocio no necesitan manejar datos sensibles de tarjetas. En cambio, puedes usar una de nuestras [integraciones de pago](https://docs.stripe.com/payments.md) de bajo riesgo para recopilar y transmitir de forma segura la información de pago directamente a Stripe sin que pase por tus servidores, lo que reduce tus obligaciones relacionadas con la normativa PCI. ### Datos de tarjetas fuera del alcance que puedes almacenar en forma segura Stripe devuelve información no confidencial de la tarjeta en respuesta a una solicitud de cargo. Estos datos incluyen el tipo de tarjeta, los últimos cuatro dígitos de la tarjeta y la fecha de vencimiento. Esta información no está sujeta al cumplimiento de la normativa PCI, por lo que puedes almacenar cualquiera de estas propiedades en tu base de datos. Asimismo, puedes almacenar lo que sea que devuelva nuestra [API](https://docs.stripe.com/api.md). ## Usar TLS y HTTPS TLS es el proceso de transmisión segura de datos entre el cliente (la aplicación o el navegador que usa tu cliente) y tu servidor. En un principio, el protocolo Secure Sockets Layer (SSL) realizaba esta tarea, pero está desactualizado y ya no es seguro. TLS reemplazó a SSL, pero el término *SSL* continúa usándose coloquialmente cuando se refiere a TLS y su función para proteger los datos transmitidos. Las páginas de pagos deben usar una versión reciente (TLS 1.2 o superior) porque reduce significativamente el riesgo de ataques de intermediarios tanto para ti como para tus clientes. Estos son los objetivos de TLS: - Cifrar y verificar la integridad del tráfico entre el cliente y tu servidor. - Verifica que el cliente se comunique con el servidor correcto. En la práctica, esto implica verificar que el titular del dominio y el titular del servidor sean la misma persona. De esta manera, se previenen los ataques de intermediario. Sin esta verificación, no hay garantía de que estés cifrando el tráfico al destinatario correcto. Asegurarse de que los recursos (por ejemplo, JavaScript, CSS e imágenes) también utilicen el protocolo TLS para evitar que tus clientes vean una [advertencia de contenido mixto](https://web.dev/what-is-mixed-content/) en el navegador. El uso de TLS requiere un *certificado digital*, un archivo emitido por una autoridad de certificación (CA). La instalación de este certificado asegura al cliente que en realidad se está comunicando con el servidor con el que espera estar hablando, y no con un impostor. Debes obtener un certificado digital de un proveedor de certificadosacreditado, por ejemplo: - [Cifremos](https://letsencrypt.org/) - [DigiCert](https://www.digicert.com/tls-ssl/basic-tls-ssl-certificates) - [NameCheap](https://www.namecheap.com/security/ssl-certificates.aspx) Puedes [probar tu integración](https://docs.stripe.com/testing.md) sin usar HTTPS si es necesario y habilitarlo cuando todo esté listo para aceptar cargos activos. No obstante, todas las interacciones entre tu servidor y Stripe deben usar HTTPS (es decir, cuando se usan nuestras bibliotecas). ### Configurar TLS Para configurar TLS: 1. Compra un certificado de un proveedor adecuado. 1. Configura el servidor para que use el certificado. Este paso es complejo, así que sigue la guía de instalación del proveedor que utilices. Como se trata de un conjunto complejo de herramientas de cifrado, es fácil pasar por alto algunos detalles. Te recomendamos usar la [prueba de servidor SSL](https://www.ssllabs.com/ssltest/) de Qualys SSL Labs para asegurarte de haber configurado todo de manera segura. ## Consideraciones de seguridad Incluir JavaScript desde otros sitios puede implicar un riesgo de seguridad, ya que tu seguridad pasará a depender de la de esos sitios. Si son víctimas de un ataque alguna vez, el atacante podrá ejecutar código arbitrario en tu página. En la práctica, muchos sitios hacen uso de JavaScript para servicios como Google Analytics, incluso en páginas seguras. Sin embargo, es algo de lo que debemos estar conscientes y, de ser posible, debemos minimizar. Si usas *webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests), usa TLS para el punto de conexión a fin de evitar que se intercepte el tráfico y se alteren las notificaciones (nunca se incluye información confidencial en un evento webhook). También debes [verificar las firmas de webhooks](https://docs.stripe.com/webhooks.md#verify-official-libraries) y [enumerar las direcciones IP de Stripe](https://docs.stripe.com/ips.md) para asegurarte de que cada webhook de Stripe que recibas sea enviado exclusivamente por Stripe. Si bien cumplir con las Normas de seguridad de datos es importante, el abordaje de la seguridad no debe terminar ahí. Aquí encontrarás recursos interesantes para aprender más sobre seguridad en la web: - [OWASP](https://owasp.org/) - [SANS](https://www.sans.org/reading-room/) - [NIST](http://csrc.nist.gov/) ### Política de seguridad de contenido Si implementaste una *Política de Seguridad de Contenido* (Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks), el conjunto completo de directivas que requieren Checkout, los componentes integrados de Connect y Stripe.js son los siguientes: #### Checkout - `connect-src`, `https://checkout.stripe.com` - `frame-src`, `https://checkout.stripe.com` - `script-src`, `https://checkout.stripe.com` - `img-src`, `https://*.stripe.com` #### Componentes integrados de Connect - `frame-src` `https://connect-js.stripe.com` `https://js.stripe.com` - `img-src` `https://*.stripe.com` - `script-src` `https://connect-js.stripe.com` `https://js.stripe.com` - `style-src` `sha256-0hAheEzaMe6uXIKV4EehS9pu1am1lj/KnnzrOYqckXk=` (SHA del elemento de estilo vacío) Si utilizas un archivo CSS para cargar [fuentes web](https://docs.stripe.com/connect/get-started-connect-embedded-components.md#fonts-object) para usar con componentes integrados de Connect, su URL debe estar permitida por tu directiva CSP [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src). #### Stripe.js - `connect-src`, `https://api.stripe.com`, `https://maps.googleapis.com` - `frame-src`, `https://*.js.stripe.com`, `https://js.stripe.com`, `https://hooks.stripe.com` - `script-src`, `https://*.js.stripe.com`, `https://js.stripe.com`, `https://maps.googleapis.com` > La adición `*.js.stripe.com` le permite a Stripe.js mejorar el rendimiento iniciando fotogramas en diferentes orígenes, siempre que sea posible. Si utilizas un archivo CSS para cargar [fuentes web](https://docs.stripe.com/js.md#stripe_elements) para usar con Elements, su URL debe ser autorizada por tu directiva [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src) de la política de seguridad de contenido (CSP). Si estás utilizando un método de pago con funciones de redireccionamiento (por ejemplo, tarjetas que quizá requieran 3D Secure o iDeal), incluye `https://hooks.stripe.com` como directiva `frame-src`. Si utilizas el [Address Element](https://docs.stripe.com/elements/address-element.md) con tu propia clave de API de Google Maps, incluye `https://maps.googleapis.com` como directiva connect-src y script-src. Consulta la [guía oficial de la API de Google Maps](https://developers.google.com/maps/documentation/javascript/content-security-policy) para conocer los requisitos de CSP más actualizados. Si usas [Trusted Types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/require-trusted-types-for), debes permitir la carga de scripts dinámicos desde `https://js.stripe.com` y `https://*.js.stripe.com`. Puedes usar el siguiente ejemplo de [política predeterminada](https://w3c.github.io/webappsec-trusted-types/dist/spec/#default-policy-hdr) para habilitarla: ```javascript trustedTypes.createPolicy('default', { createScriptURL: (input) => { const stripeURL = /^https:\/\/([a-z0-9-]+\.)?js\.stripe\.com$/; const origin = new URL(input).origin; if (stripeURL.test(origin)) { return input; } return undefined; }, }); ``` ### Compatibilidad con el aislamiento de origen cruzado Actualmente, no se admiten *sitios de origen cruzado* (Cross-origin isolation is an opt-in security feature that helps prevent side-channel attacks by ensuring that a document loads in a unique, isolated browsing environment). Requiere el soporte de todas las dependencias, y varias dependencias clave que habilitan nuestras ofertas de pago aún no proporcionan soporte para esta funcionalidad. ## See also - [Cumplimiento de la normativa PCI DSS](https://stripe.com/guides/pci-compliance) - [Prácticas recomendadas para gestionar claves secretas de API](https://docs.stripe.com/keys-best-practices.md) - [Webhooks](https://docs.stripe.com/webhooks.md) - [Pagos rechazados y pagos fallidos](https://docs.stripe.com/declines.md) - [Resumen de las disputas](https://docs.stripe.com/disputes.md)