Je suis bien conscient de la Conformité PCI, donc n'ont pas besoin d'une bonne dose sur le stockage des numéros de CC (et surtout CVV nums) au sein de notre entreprise de base de données lors du processus de commande.
Cependant, je veux être sûr que possible lors de la manipulation des consommateurs sensibles à l'information et je suis curieux de voir comment la contourner en passant CC les numéros de page en page SANS l'aide des variables de SESSION, si possible.
Mon site est construit de cette façon:
- Étape 1) recueillir de Carte de Crédit l'information de la clientèle - lorsque client hits soumettre, le l'information est d'abord exécuté par JS la validation, puis exécuter par le biais de PHP la validation, si toutes les passes qu'il se déplace à l'étape 2.
- Étape 2) l'Information est affichée sur une page de révision pour le client à faire assurez-vous que les détails de leur prochain des transactions sont affichés. Seul le les 6 premiers et les 4 derniers de la CC sont montré sur cette page, mais le type de la carte, et exp date sont shwon entièrement. Si il clique sur continuer,
- Étape 3) L'information est envoyée à une autre page php qui s'exécute une dernière validation, envoie des informations par le biais de la passerelle de paiement sécurisé, et la chaîne renvoyée est avec des détails.
- Étape 4) Si tout est bon et bien, le l'information des consommateurs (personnel, pas CC) est stocké dans la bd et la redirection pour une page de fin. Si quelque chose est mauvais, il est informé et a dit à revoir le CC et la page de traitement de essayez à nouveau (avec un maximum de 3 fois).
Toutes les suggestions?
MODIFIER
J'ai reçu beaucoup de très bonne réponse sur cette question à la majorité semblent être d'accord sur les points suivants:
- la prise de variables POST après l'exécution de la validation
- le chiffrement ccnum et le cryptogramme de sécurité (pas sûr vous êtes autorisé à stocker des cvv en DB à tous tout de même)
- Le stockage temporaire de la DB
- L'accès DB immédiatement après la "révision" la page est OK avais
- déchiffrer les détails de DB
- envoyer des informations de processeur
- recevoir de réponse
- résilier DB
Je pense que cela a un sens global. Quelqu'un at-il une bonne méthode pour le chiffrement/déchiffrement avec la meilleure façon de créer de la temp DB info qui est automatiquement supprimé au plus tard à l'appel?
Je suis à la programmation en PHP et MySQL DB
EDIT #2
Je suis tombé sur des Paquets Générale, ce qui semble être une solution idéale, mais VRAIMENT ne voulez pas payer pour une autre licence de logiciel pour atteindre cet objectif.
http://www.packetgeneral.com/pcigeneralformysql.html
EDIT #3 - Exemple de Code
Maintenant j'ai posté un exemple de code que j'ai mis ensemble à essayer de faire sens de chiffrement/déchiffrement et de stockage mentionné dans ce post. J'espère que, déjà utile contributeurs peuvent valider et d'autres sont en mesure d'utiliser des fonctionnalités similaires. Pour des raisons de longueur, je ne vais pas entrer dans les méthodes de validation utilisée pour la CC num lui-même.
Formulaire De Saisie
<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 Chiffrer et Stocker des Données
<?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 le décryptage des données et l'envoi de la passerelle
$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);
?>
procéder ensuite à prendre les données qui viennent d'être envoyé dans la chaîne et de l'utilisation de la Passerelle de présentation. Semble juste?