# Guida alla sicurezza dell'integrazione Come assicurare la conformità alle norme PCI e delle comunicazioni sicure tra il cliente e il server. Il [Payment Card Industry Data Security Standard](https://www.pcisecuritystandards.org/pci_security/) (PCI DSS) è lo standard di sicurezza globale per tutte le entità che memorizzano, elaborano o trasmettono i dati del titolare della carta o i dati sensibili di autenticazione. Il PCI DSS stabilisce un livello minimo di protezione per i consumatori e contribuisce a ridurre le frodi e le violazioni dei dati nell’intero ecosistema dei pagamenti. Chiunque sia coinvolto nell’elaborazione, nella trasmissione o nella memorizzazione dei dati delle carte deve conformarsi al PCI DSS. ## Convalidare la conformità alle norme PCI La conformità alle norme PCI è una responsabilità condivisa e si applica sia a Stripe che alla tua attività: - Stripe è certificata annualmente da un QSA (Qualified Security Assessor) PCI indipendente come fornitore di servizi [PCI di livello 1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe,%20inc) che soddisfa tutti i requisiti PCI. - In qualità di attività che accetta pagamenti, devi rispettare le norme PCI e attestare annualmente tale conformità. Esamina i requisiti della documentazione per la tua attività nella [Dashboard](https://dashboard.stripe.com/settings/compliance/documents) e continua a leggere questa guida per scoprire come Stripe può aiutarti a garantire la conformità alle norme PCI. ## Utilizzare integrazioni a basso rischio Alcuni modelli di business richiedono l’inserimento di PAN non tokenizzati in una pagina di pagamento. Se la tua attività gestisce direttamente dati sensibili relativi alle carte di credito durante l’accettazione dei pagamenti, potresti dover soddisfare oltre 300 controlli di sicurezza previsti dallo standard PCI DSS. Ciò potrebbe richiedere l’acquisto, l’implementazione e la manutenzione di software e hardware di sicurezza dedicati, nonché l’assunzione di revisori esterni per supportare i requisiti di valutazione annuali. Molti modelli di business non richiedono la gestione di dati sensibili delle carte. In alternativa, puoi utilizzare una delle nostre [integrazioni di pagamento](https://docs.stripe.com/payments.md) a basso rischio per raccogliere e trasmettere in modo sicuro le informazioni di pagamento direttamente a Stripe senza che transitino sui i tuoi server, riducendo così i tuoi obblighi in termini di PCI. ### Dati della carta fuori dal campo di applicazione che puoi memorizzare in sicurezza In risposta a una richiesta di addebito, Stripe restituisce informazioni non sensibili sulla carta, come il tipo di carta, le ultime quattro cifre e la data di scadenza. Queste informazioni non sono soggette alle norme di conformità PCI e puoi quindi memorizzarle nel tuo database. Puoi inoltre memorizzare tutto quello che ti viene restituito dalla nostra [API](https://docs.stripe.com/api.md). ## Usare TLS e HTTPS TLS si riferisce al processo di trasmissione sicura dei dati tra il client (l’app o il browser che il cliente sta usando) e il tuo server. Tale processo veniva originariamente eseguito utilizzando il protocollo SSL (Secure Sockets Layer). Questo protocollo, ormai obsoleto e non più sicuro, è stato sostituito dal TLS. Il termine *SSL* continua tuttavia a essere usato colloquialmente per riferirsi al TLS e alla sua funzione di protezione dei dati trasmessi. Le pagine di pagamento devono utilizzare una versione recente (TLS 1.2 o superiore) perché consente di ridurre significativamente il rischio di attacchi man-in-the-middle sia per te che per i tuoi clienti. TLS intende realizzare quanto segue: - Crittografare e verificare l’integrità dei dati relativi al traffico tra il client e il tuo server. - Verificare che il client stia comunicando con il server corretto. Normalmente, ciò significa che il proprietario del dominio e il proprietario del server sono la stessa entità. Questo aiuta a evitare attacchi man-in-the-middle. Senza questa verifica, non si può garantire che il traffico venga crittografato verso il destinatario corretto. Accertati che anche tutte le risorse (per esempio JavaScript, CSS e immagini) siano gestite su TLS per evitare che un [avviso di contenuto misto](https://web.dev/what-is-mixed-content/) venga visualizzato nel browser dei tuoi clienti. L’utilizzo di TLS richiede un *certificato digitale*, ovvero un file emesso da un’autorità di certificazione (CA, Certification Authority*). Una volta installato, il certificato assicura al client che sta realmente comunicando con il server desiderato e non con un impostore. Fatti rilasciare il certificato digitale da un fornitore di certificati serio, come: - [Let’s Encrypt](https://letsencrypt.org/) - [DigiCert](https://www.digicert.com/tls-ssl/basic-tls-ssl-certificates) - [NameCheap](https://www.namecheap.com/security/ssl-certificates.aspx) Puoi eseguire il [test della tua integrazione](https://docs.stripe.com/testing.md) senza usare HTTPS e abilitarlo quando è tutto pronto per accettare addebiti in modalità live. Comunque, tutte le interazioni tra il tuo server e Stripe devono usare HTTPS (ad esempio quando usi le nostre librerie). ### Configurare TLS Per configurare TLS: 1. Acquista un certificato da un fornitore appropriato. 1. Configura il server per l’utilizzo del certificato. Questo passaggio è complesso, quindi segui la guida all’installazione del provider che utilizzi. Dato che TLS è una complessa suite di strumenti crittografici, è facile trascurare qualche dettaglio. Per accertarsi che la configurazione sia stata completata in modo sicuro, consigliamo di utilizzare [SSL Server Test](https://www.ssllabs.com/ssltest/) di Qualys SSL Labs. ## Considerazioni sulla sicurezza Includere JavaScript da altri siti può essere un rischio per la sicurezza perché la tua sicurezza diventa dipendente dalla loro. Se quei siti dovessero essere compromessi, un utente malintenzionato potrebbe riuscire a eseguire codice arbitrario sulla tua pagina. In pratica, molti siti utilizzano JavaScript per servizi come Google Analytics, anche su pagine sicure. Tuttavia, ti consigliamo di ridurre al minimo questo rischio. Se utilizzi i *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests), utilizza TLS per l’endpoint per evitare che il traffico venga intercettato e che le notifiche vengano alterate (le informazioni sensibili non sono mai incluse in un evento webhook). Devi anche [verificare le firme webhook](https://docs.stripe.com/webhooks.md#verify-official-libraries) e [consentire l’inserimento degli indirizzi IP di Stripe](https://docs.stripe.com/ips.md) per garantire che ogni webhook Stripe ricevuto venga inviato esclusivamente da Stripe. Quando si parla di sicurezza, non bisogna limitarsi alla conformità con gli standard di sicurezza dei dati. A tal fine, alcune risorse utili sono: - [OWASP](https://owasp.org/) - [SANS](https://www.sans.org/reading-room/) - [NIST](http://csrc.nist.gov/) ### Criteri di sicurezza del contenuto Se hai implementato dei *Criteri di sicurezza del contenuto* (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), l’insieme completo delle direttive necessarie per Checkout, per i componenti incorporati di Connect e per Stripe.js comprende: #### Checkout - `connect-src`, `https://checkout.stripe.com` - `frame-src`, `https://checkout.stripe.com` - `script-src`, `https://checkout.stripe.com` - `img-src`, `https://*.stripe.com` #### Componenti incorporati di 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 dell’elemento di stile vuoto) Se utilizzi un file CSS per caricare [caratteri web](https://docs.stripe.com/connect/get-started-connect-embedded-components.md#fonts-object) da utilizzare con componenti incorporati di Connect, l’URL deve essere consentito dalla direttiva 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` > L’aggiunta di `*.js.stripe.com` consente a Stripe.js di migliorare le prestazioni avviando le tempistiche su origini diverse, ove possibile. Se usi un file CSS per caricare [web font](https://docs.stripe.com/js.md#stripe_elements) da usare con Elements, l’URL deve essere consentito dalla nostra direttiva CSP [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src). Se usi un metodo di pagamento con funzioni di reindirizzamento (ad esempio, carte che potrebbero richiedere 3D Secure o iDeal), includi `https://hooks.stripe.com` come direttiva `frame-src`. Se stai utilizzando [Address Element](https://docs.stripe.com/elements/address-element.md) con la tua chiave API di Google Maps, includi `https://maps.googleapis.com` come direttiva connect-src e script-src. Fai riferimento alla [guida ufficiale dell’API di Google Maps](https://developers.google.com/maps/documentation/javascript/content-security-policy) per il requisito CSP più aggiornato. Se usi [Trusted Types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/require-trusted-types-for), devi consentire il caricamento di script dinamici da `https://js.stripe.com` e `https://*.js.stripe.com`. Puoi utilizzare l’esempio di [criterio di default](https://w3c.github.io/webappsec-trusted-types/dist/spec/#default-policy-hdr) seguente per consentirlo: ```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; }, }); ``` ### Assistenza per l’isolamento multiorigine Al momento non supportiamo i *siti con isolamento multiorigine* (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). Tuttavia, questa funzionalità richiede il supporto di tutte le dipendenze, e alcune dipendenze chiave per le nostre offerte di pagamento non sono ancora compatibili. ## See also - [Conformità agli standard PCI DSS](https://stripe.com/guides/pci-compliance) - [Best practice per la gestione di chiavi API private](https://docs.stripe.com/keys-best-practices.md) - [Webhook](https://docs.stripe.com/webhooks.md) - [Pagamenti rifiutati e non riusciti](https://docs.stripe.com/declines.md) - [Panoramica dei rifiuti](https://docs.stripe.com/disputes.md)