OTURUM Kredi Kartı Numaraları saklama - çevresindeki yollar?

12 Cevap php

Ben PCI Uyum farkındayım yani ödeme işlemi sırasında şirket veritabanı içinde CC numaraları (ve özellikle CVV nums) saklanması hakkında bir azar gerekmez.

Ancak, duyarlı tüketici bilgileri işlerken mümkün olduğunca güvenli olmasını istiyorum ve OTURUM değişkenleri eğer mümkünse kullanarak OLMADAN sayfadan CC numaraları geçen etrafında nasıl merak ediyorum.

Sitem bu şekilde inşa edilmiştir:

  1. Step 1) collect Credit Card information from customer - when customer hits submit, the information is first run through JS validation, then run through PHP validation, if all passes he moves to step 2.
  2. Step 2) Information is displayed on a review page for customer to make sure the details of their upcoming transaction are shown. Only the first 6 and last 4 of the CC are shown on this page but card type, and exp date are shwon fully. If he clicks proceed,
  3. Step 3) The information is sent to another php page which runs one last validation, sends information through secure payment gateway, and string is returned with details.
  4. Step 4) If all is good and well, the consumer information (personal, not CC) is stored in DB and redirected to a completion page. If anything is bad, he is informed and told to revisit the CC processing page to try again (max of 3 times).

Herhangi bir öneriniz?

EDIT

Ben bu soruya gerçekten iyi yanıt bir sürü aldık - çoğunluk aşağıdaki üzerinde hemfikir görünüyor:

  1. taking POST variables after validation is run
  2. encrypting ccnum and cvv (not sure you are allowed to store cvv in DB at all though)
  3. Geçici DB saklanması
  4. Access DB immediately after 'review' page is OK'd
  5. DB ayrıntıları şifresini
  6. işlemciye bilgi göndermek
  7. yanıtı alırsınız
  8. DB sonlandırmak

Ben bu genel mantıklı düşünüyorum. Herkes daha sonra otomatik olarak çağrı üzerine silinir geçici DB bilgi oluşturmak için en iyi yolu ile birlikte şifreleme / şifre çözme için iyi bir yöntem var mı?

PHP ve MySQL DB programlama am

EDIT #2

I came across Packet General which seems like an ideal solution but REALLY don't want to pay for another software license to accomplish this goal. http://www.packetgeneral.com/pcigeneralformysql.html

EDIT #3 - Sample Code

Ben şimdi şifreleme / şifre çözme / anahtar ve bu yazı belirtilen depolama anlamaya çalışırken araya bazı örnek kod attılar. Umarım, zaten yararlı katkıda doğrulamak ve diğerleri benzer işlevleri kullanmak mümkün. Uzunluğu uğruna ben gerçek CC num kendisi için kullanılan doğrulama yöntemleri girmeyeceğim.

Form Input

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="text" name="CC" />
<input type="text" name="CVV" />
<input type="text" name="CardType" />
<input type="text" name="NameOnCard" />
<input type="submit" name="submit" value="submit" />
</form>

PHP Encrypt and Storing Data

<?php

$ivs = mcrypt_get_iv_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivs,MCRYPT_RAND);
$key = "1234"; //not sure what best way to generate this is!
$_SESSION['key'] = $key;

$ccnum = $_POST['CC'];
$cvv = $_POST['CVV'];
$cctype = $_POST['CardType'];
$ccname = $_POST['NameOnCard'];

$enc_cc = mcrypt_encrypt(MCRYPT_DES, $key, $ccnum, MCRYPT_MODE_CBC, $iv);
$enc_cvv = mcrypt_encrypt(MCRYPT_DES, $key, $cvv, MCRYPT_MODE_CBC, $iv);
$enc_cctype = mcrypt_encrypt(MCRYPT_DES, $key, $cctype, MCRYPT_MODE_CBC, $iv);
$enc_ccname = mcrypt_encrypt(MCRYPT_DES, $key, $ccname, MCRYPT_MODE_CBC, $iv);


//if we want to change BIN info to HEXIDECIMAL
// bin2hex($enc_cc)

$conn = mysql_connect("localhost", "username", "password");
mysql_select_db("DBName",$conn);

$enc_cc = mysql_real_escape_string($enc_cc);
$enc_cvv = mysql_real_escape_string($enc_cvv);
$enc_cctype = mysql_real_escape_string($enc_cctype); 
$enc_ccname = mysql_real_escape_string($enc_ccname);

$sql = "INSERT INTO tablename VALUES ('$enc_cc', '$enc_cvv', '$enc_cctype', '$enc_ccname');

$result = mysql_query($sql, $conn) or die(mysql_error());
mysql_close($conn);

Header ("Location: review_page.php");

?>

PHP decrypting data and sending off to gateway

    $conn = mysql_connect("localhost", "username", "password");
    mysql_select_db("DBName",$conn);

$result = mysql_query("SELECT * FROM tablename");

echo mcrypt_decrypt (MCRYPT_DES, $_SESSION['key'], $enc_ccnum, MCRYPT_MODE_CBC, $iv);
echo mcrypt_decrypt (MCRYPT_DES, $_SESSION['key'], $enc_cvv, MCRYPT_MODE_CBC, $iv);
echo mcrypt_decrypt (MCRYPT_DES, $_SESSION['key'], $enc_cctype, MCRYPT_MODE_CBC, $iv);
echo mcrypt_decrypt (MCRYPT_DES, $_SESSION['key'], $enc_ccname, MCRYPT_MODE_CBC, $iv);

mysql_close($con);
?>

sonra sadece Ağ Geçidi teslimiyet dize ve kullanım gönderilen verileri almaya devam. Doğru görünmüyor?

12 Cevap

Kredi kartı bilgilerini depolama gerekliliği kurtulmak için çıkış sürecini değiştirerek düşünün.

Page 1: User enters non-credit-card order information, like shipping and billing address
Page 2: User verifies non-credit-card order information, enters credit card information, and clicks "Pay Now" (or "Revise Order" if they want to change things)
Step 3: Info is submitted via a $_POST request to an SSL page, which completes serverside checks, submits credit card data to processor, and directs the user to a success or error page based on the response.

Bu şekilde, teknik sorunlar ve uyum sorunları bir pus kaçınmak gerekir. Hatta kısa bir süre için bir veritabanı veya çerez, kredi kartı verileri saklama, şifreli bile, PCI uyumluluk daha yüksek düzeyde sorumlu olduğunuzu demek OLACAKTIR. Sadece Tradeoff kredi kartı detayları ile bir "yorum düzen" sayfasını göstermek mümkün olmayacaktır olduğunu. Ve bir haddin sizin "yorum düzen" sayfası bile tam kredi kartı numaranızı göstermek değil göz önüne alındığında, ne kadar büyük?

Herhangi bir sebat ortamda (veritabanı, her neyse) kart bilgilerini saklamak, ancak oturumda depolamak benzersiz bir and random tuşu ile kart numarası şifrelemek. Oturum kaybolur eğer Bu şekilde, anahtar too - Sana süresi dolmuş / terk edilmiş verileri temizlemek için yeterli zamanı verir.

Ayrıca oturumları kaçırma korumalı olduğundan emin olun. Orada bu donanım çözümleri vardır, ancak basit bir in-kod yönlü IP ilk sekizli artı kullanıcı aracısı bir karma oturum kimliği kravat etmektir. Şaşmaz ama yardımcı olur.

Edit: The key bits to minimizing your risk is to make sure you get rid of that info as soon as possible. Right after the transaction goes through, delete the record from the database. You also need a rolling job (say every 5 minutes) that deletes any records older than your session timeout (usually 20 minutes). Also, if you are using a database for this very temporary data, make sure it is not on an automated backup system.

Yine, bu çözüm kusursuz değildir ve ben CC güvenlik gereksinimleri ile uyumlu olsa bile% 100 emin değilim. Ancak, aktif müşteri CC bilgi şifresini ortamınızdaki toplam zamanı kontrole sahip bir saldırganın istemeniz gerekir, ve veritabanı anlık tehlikeye if (ortak / çok daha muhtemeldir), sadece bir CC bir anda kaba zorla olabilir hangi için umut olabilir en iyi ilgili.

Eğer onay adımı atlayın ve sadece hemen işlem sunamazlar herhangi bir neden var mı?

Bir veritabanında tutarak bir oturum değişkeni tutarak daha fazla bir güvenli neden göremiyorum - sunucu uzlaşma hala kredi kartı numarasını vermek, ancak oturumda tutmak eğer yazılacak çok daha az olasıdır diski. İsterseniz şifreleyebilirsiniz, ancak bu yararlılığı (hala diske takas olacak) şüphelidir. Tehlikeye makine sadece şifresini yapmak için diğer sorablirsin beri şifrelenmiş depolama yapmak için başka bir makine ekleme, ya da yardımcı olmuyor.

EDIT: Sadece bu düşünce:

  1. Rastgele bir 128-bit anahtar oluşturun. Oturumunda bu kaydedin.
  2. Tuşu ile verileri şifrelemek. Bir yılında client bunu gönderin
  3. Onayında, verilerin şifresini çözmek ve işlem sunacak.

Saldırgan, kredi kartı numarası (örneğin, bir saldırganın muhtemelen yine zaten dizi olurdu) almak için istemci ve sunucu hem de uzlaşma gerekiyor. Bir online sunucu uzlaşma hala gelecek işlemlerin kredi kartı numaralarını alacak, ama sen gerçekten o duramazsınız.

EDIT: Ve ben ayrıntılarını unuttum. Bu programların hepsinde (sadece benim değil) için, ayrıca (alışveriş sepeti ve fatura adresi değiştirir, ya da Havva Alice yöne çevirmek ve "onaylamak" sayfa ... hit) tekrar saldırılarını engellemek için bir MAC gerekiyor. Genel olarak, size (CC, CVV, işlem kimliği, işlem tutarı, fatura adresi ...) olan tüm işlem verileri üzerinde bir MAC var istiyorum.

Ben önünüzde uyum baş ağrısı bir kabus var Eğer PCI uyumluluk farkındayız söz biliyorum, ama zaten açıklanan yöntemlerden herhangi biri (örneğin, her yerde diske kartı numarasını ısrarcı) kullanılarak PCI faul düşecek ve demek. Eğer gerçekten diske kartı numarasını ısrar ısrar ederseniz, o zaman siz de sürecinde size yardımcı olmak ve tavsiyelerde şimdi bir PCI denetçi alabilirsiniz. Sonuçta onlar Çektiğiniz yöntem uygun olduğunu doğrulamak gerekir.

Bir örnek olarak, cevapları burada bir sürü şifreleme kullanma hakkında konuşun. Kolay bit Thats. Onlar significantly harder olan anahtar yönetimi hakkında konuşmadık

Bu yüzden daha iyi bir yaklaşım kısa sürede toplanan gibi ödeme ağ geçidi kartı bilgilerini göndermek için olacağını düşünüyorum. Ödeme ağ geçitleri iyi bir tane kart ayrıntıları temel doğrulama gerçekleştirmek ve kart numarası saklayacak tarzı işlem 'yalnızca mağazası', gerçekleştirmek için izin verecektir kendi sunucusu (zaten PCI uyumlu), ve bunun yerine bir simge kimliği döndürür. Bu yöntem, sunucular üzerinde herhangi bir yerde tam kartı number/cvv2 saklamak DONT anlamına gelir, ve PCI uyumluluk bir huge miktarı daha kolay olur.

Daha sonra çıkış sürecinde bir yetki ve yerleşim göndermek için belirteç id kullanın.

PCI onlar hemen önce son adım yeniden görüntülenmesi böylece rahat konum her yerde güvenle bu yakalayabilir, böylece düz metin olarak cardnumber ilk altı / son dört hanesi (ve son kullanma tarihi) saklamak için izin verir.

Haklısınız, sessions hassas veri depolamak için çok güvensizdir kullanarak olarak biliyorum ne oturumlara girmeye yolu vardır:

Session hijacking
Session fixation

Aklıma gelen en güvenli yolu, (geçici bir süre için) veritabanında bilgi depolamak ve daha sonra ihtiyacınız sayfada bu değeri okumak olduğunu. Bunu tüm yapıyor bitirdikten sonra, onu geri silebilirsiniz.

Note that:

  • Eğer gerekir encrypt bu veritabanına kaydetmeden önce.
  • Eğer shared hosting üzerinde iseniz dikkatli olun
  • Eğer delete geri zamanlar onunla yapılır emin olun

Sen düşünceli yararlı yanı :) this bulabilirsiniz

Bu veritabanı için budur. Ben (ülkeye ve bölgeye göre değişir) burada hukuki sonuçları hakkında emin değilim, ama bir yaklaşım CC sayıda şifrelemek ve kısa sürede kullanıcıya onu almak gibi veritabanında saklamak olacaktır. Gerekli zaman kullanıcıya göstermek, böylece ayrı bir alanda son 4 rakamını saklamak isteyebilirsiniz. Eğer sunucuda kartı işlemci ile etkileşim gerektiğinde, almak ve veritabanından kartı numarasını şifresini.

Zaten size güvenli kredi kartı numarası depolama yetenekleri sağlamak gerekir, dokunmak görünür. Sunucu tehlikeye girdiğinde, herhangi bir zamanda, şu anda kayıtlı kredi kartı numaraları (yani tuşları ve şifreli sayılar) şifresini çözmek için yeterli bilgi içerecektir. Potansiyel çözüm "Şifreleyici / decryptor" hizmet ve başka bir şey gibi davranan bir iç sunucu kullanmaktır. Bir makine ödün Bu şekilde kredi kartı numaralarını göstermiyor.

Orada başka bir yoludur, ancak Ajax gerektirir. Kredi kartı numaraları depolanması ve bir yorum sayfası yok.

Sayfa 1: Form kargo, fatura ve kredi kartı bilgilerinizi yakalamak için. Formu dahil olmak üzere sayfanın "vücut", JavaScript ile başvurmak izin için benzersiz bir kimlik ile bir DIV olduğundan emin olun.

Sayfa 2: onun içinde form alanları ile bir GET / POST isteğini kabul ve beğeninize düzgün biçimlendirilmiş bir "yorum" sayfasını dönecektir sunucu üzerinde bir dosya.

Ödeme işlemi:

  1. Formu doğrulamak.
  2. Küresel JavaScript değişkenleri içine kopya kredi kartı ilgili alanlar.
  3. Form alanları ile ve (kredi kartı ile ilgili alanlarda hariç) form alanları ile bir sorgu / veri dizesi oluşturmak döngü
  4. Onunla form alanı / değerlerinin sorgu dizesi geçirerek, "yorum" sayfasına bir Ajax istek yapmak. Sunucuda Render ve Ajax işlevini çağırarak dönmek.
  5. Ajax isteği döndü işlenmiş HTML inceleme sayfasını alın ve (etkin incelemesi HTML formu ve diğer öğeleri değiştirme) onunla "DIV" konteyner içeriği değiştirin.
  6. Incelemesi sayfasında uygun bir yere içine küresel JS değişkenler saklanan kredi kartı verileri kopyalamak için JavaScript kullanın. Ayrıca kullanıcı "yorum" sayfasından sipariş "tamamlar" ne göndermek için gizli form alanları için kartı verileri kopyalayabilirsiniz.
  7. Kullanıcı sipariş veya taşıma sayfa hata dönen, kart bilgilerini saklı olan hiç ya sonra işlemcinin ağ geçidi ile kart doğrulama yapmak ve, yorum sayfasından sunucuya onayına sunar.
  8. Ben "yer düzen" fonksiyonu artık küresel JS değişkenler saklanan kartı verileri içeren bir sayfa ile tarayıcıyı yeniden amacıyla (yerine Ajax daha) tam bir HTTP isteği gerçekleştirmek öneriyoruz.

Bir kesmek biraz, ama doğru yapıldığında, o kullanıcıya% 100 kesintisiz bulunuyor ve size geçici DB depolanması, vb riskleri üstlenme gerek kalmadan kartı tek bir veri iletimini sağlar

Siz oturumda kart nr ve aynı karma ve bir veritabanında gerçek sayı ve kullanıcının oturum kimliği bir karma depolayabilir. Sonra her sayfa için karma ve kart nr almak için oturum bilgi kontrol edebilirsiniz.

Ödeme işlemleri (3. adımda son kısmı) daha sonra bir noktada (I varsayıyorum), sen CC # şifrelemek gerekir (ve CVC) ödeme processer göndermek mümkün

Eğer ilgili bilgi almak varken neden bir sonraki onay sayfası için gerekli gizleme için, bu şifreleme doğru yapmak değil. (Bu adım 1 son parçasıdır)

Şu andan itibaren, sadece CC-şirket aslında tam verilerin şifresini çözebilir tek yapım, bu şifreli veya karartılmış verilerle çalışmak.

Bunu yaparken planı nasıl burada - elbette SSL kullanan https üzerinden her şeyi.

1. Aşama. Kullanıcı CC bilgi girer ve bir sonraki düğmeye basar. CC bilgileri hemen değil, kendi DB veya PCI Uyum kıracağını, CC işlemcinin DB kaydedilir. CC aslında bu adımı tahsil edilmez. Ama CC bilgi tanımlayan işlemciden bazı benzersiz kimliği tarifesi olmalıdır. (Eğer isterseniz db olarak benzersiz id saklamak)

Adım 2. Onay sayfasında, sana verdikleri benzersiz kimliği kullanarak CC işlemciden CC bilgi almak. Benim işlemci sadece bana yine CC son 4 numaralarını görmenizi sağlayacak.

Onlar satın onayladıktan sonra. Adım 3 ve şimdi düğmeye satın basın, benzersiz kimliği kullanarak kredi kartı ücret.

Adım 4.. (Tabii CC son 4 göstermek zorunda değilsiniz, ama göstermek için güzel bir şey olduğunu düşünüyorum, sadece CC son 4 basamak fatura / makbuz içeren bir teşekkür size sayfaya yönlendirelim .)

Bilgilerini tutmak için oturumları için gerek veya veritabanı yoktur.

Her sayfası verileri nakleder bir şeklidir. Sonraki her sayfada önceki sayfada post değişkenleri, böylece bir sonraki form gönderme mesaj verileri tekrar gizli form alanları eklenir. Bu şekilde hiçbir şey saklanır, ancak bilgileri sayfa sayfa yapılır. Bu adımları da atlamak çalışırken olmadan baştan sona işlemini tamamlamak için kullanıcı zorlar.

Sürece formu HTTPS üzerinden teslim olarak, veri otomatik olarak şifrelenir ve güvenlik yükü SSL sertifika sağlayıcısı üzerinde olmasıdır.

Birçok popüler ticaret siteleri bu uygulamaya. Örnek osCommerce için.