Stocker des Numéros de Carte de Crédit en SESSION - des moyens autour d'elle?

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:

  1. É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.
  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,
  3. É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.
  4. É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).

Des 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:

  1. prendre variables POST après
    l'exécution de la validation
  2. chiffrement ccnum et le cryptogramme de sécurité (pas sûr
    vous êtes autorisé à stocker des cvv en DB
    à tous cependant)
  3. Le stockage temporaire de la DB
  4. Accès DB immédiatement après la "révision"
    la page est OK avais
  5. déchiffrer les détails de DB
  6. envoyer des informations à processeur
  7. recevoir de réponse
  8. 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 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);
?>

alors procéder à 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?

  • Appelez-moi fou, mais je pense que c'est plus facile pour enregistrer le chiffrés numéro de CC en session. Si elle n'est pas supprimée pour quelque raison que ce soit, il va disparaître lors de la session expire.
  • HOMME VOUS TELLEMENT FOU! En toute sincérité, est-il semblable à la menace TC affichés ci-dessous? Ma compréhension est que si une SESSION est détourné alors vous avez maintenant la clé et le numéro de la carte exposés.
  • Hrm... je suppose que ça dépend de l'endroit où vous gardez la touche. Je voudrais utiliser deux clés de toute façon. Une codé en dur, une clé et une clé qui change avec le client/la session. Pourrait être généré de façon aléatoire pour chaque session, plus basé sur l'agent utilisateur (adresses IP de soi-disant ne sont pas bons parce qu'ils peuvent changer en raison de l'itinérance). De cette façon, si la clé aléatoire est détourné, ils ont encore besoin d'accéder à votre code pour voler la clé, ou si ils l'ont fait, j'espère qu'ils ne sont pas assez rapides pour choper la clé aléatoire.
  • ...de toute façon, je pense que l'idée est de garder la clé et le numéro de CC séparé. Je pense qu'il y a essentiellement 4 endroits pour stocker des choses. 1) codée en dur, 2) dans la DB, 3) dans la session, 4) sur le client. 1) ne peut pas être changé, il est seulement bon pour l'enregistrement d'une clé constante. Si 3) est compromise, je dirais que 2) pourrait être contraint de céder sa info, à moins que vous n'avez pas de 3). Et 4) doivent absolument être utilisés pour s'assurer que vous êtes toujours en parler à la même client et non pas un hacker qui essaie de voler sa place.
  • ...en supposant que vous êtes l'exécution de ce sur SSL et vous avez sécurisé activé les cookies, vous ne devriez pas être en mesure de détourner la session, donc je ne pense pas qu'3) est presque aussi mauvais que les gens font dehors pour être. Profitez de tous les 4 si vous pouvez trouver un moyen.
  • ne pas utiliser <form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST"> utiliser <form action="" method="POST"> au lieu que le premier type est sensible à l'injection.
  • Détournement de Session se réfère à voler le cookie de session (stocké sur le client), pas la session de données (stockées sur le serveur). Si vous voler le cookie de session, il n'est pas n'importe où sur le serveur de stockage des données.
  • Aussi, s'il vous plaît ne pas utiliser DES. Il a été fissuré à plusieurs reprises.
  • merci pour les conseils. J'ai été vraiment à l'aide de l'exemple de code pour montrer l'ensemble du processus. Avez-vous de cryptage vous le recommande?
  • J'aimerais savoir pourquoi cette question a été downvoted un an après le fait?

InformationsquelleAutor JM4 | 2010-05-24