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:
- 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.
- 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,
- 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.
- 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:
- taking POST variables after validation is run
- encrypting ccnum and cvv (not sure you are allowed to store cvv in DB at all though)
- Geçici DB saklanması
- Access DB immediately after 'review' page is OK'd
- DB ayrıntıları şifresini
- işlemciye bilgi göndermek
- yanıtı alırsınız
- 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?