Мне хорошо известно о соблюдении PCI Compliance, поэтому не нужно разбираться в хранении номеров CC (и особенно CVV num) в нашей базе данных компании во время процесса оформления заказа.
Тем не менее, я хочу быть в безопасности, насколько это возможно, при обработке конфиденциальной информации о потребителях, и мне любопытно, как обойти номера CC с страницы на страницу БЕЗ использования переменных SESSION, если это вообще возможно.
Мой сайт построен таким образом:
- Шаг 1) собрать кредитную карту информация от клиента - когда отзывы клиентов, информация сначала запускается через JS валидация, а затем запустить через PHP проверка, если все проходит, он перемещается к шагу 2.
- Шаг 2) Информация отображается на страницу обзора для клиента обязательно подробности их предстоящих транзакции. Только первые 6 и последние 4 из CC показан на этой странице, но тип карты, и срок действия - полностью. Если он клики продолжаются,
- Шаг 3) Информация отправляется другая php-страница, которая запускает один последний проверка, отправка информации через безопасный платежный шлюз и строка возвращается с подробностями.
- Шаг 4) Если все хорошо и хорошо, потребительская информация (личная, а не CC) хранится в БД и перенаправляется на страницу завершения. Если что-то есть Плохо, ему сообщили и сказали перейдите на страницу обработки CC повторите попытку (максимум 3 раза).
Любые предложения?
ИЗМЕНИТЬ
Я получил очень хороший ответ на этот вопрос - большинство похоже согласны в следующем:
- принятие POST-переменных после проверка выполняется
- шифрование ccnum и cvv (не уверен вам разрешено хранить cvv в DB на всех, хотя)
- Сохранение в временном БД
- Доступ к БД сразу после "проверки" страница OK'd
- расшифровать данные из базы данных
- отправить информацию процессору
- получить ответ
- завершить DB
Я думаю, что это имеет смысл в целом. У кого-нибудь есть хороший метод для шифрования/дешифрования, а также лучший способ создать временную информацию БД, которая автоматически удаляется при последующем вызове?
Я программирую в PHP и MySQL DB
EDIT # 2
Я столкнулся с Packet General, который кажется идеальным решением, но ДЕЙСТВИТЕЛЬНО не хочет платить за другую лицензию на программное обеспечение для достижения этой цели.
http://www.packetgeneral.com/pcigeneralformysql.html
РЕДАКТИРОВАТЬ № 3 - Пример кода
Теперь я опубликовал некоторый пример кода, который я собрал, пытаясь понять шифрование/дешифрование/ключ и память, упомянутые в этом сообщении. Надеемся, что уже полезные вкладчики могут подтвердить, а другие могут использовать аналогичные функции. Ради длины я не буду вдаваться в методы проверки, используемые для собственно CC num.
Ввод формы
<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 Шифрование и сохранение данных
<?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 дешифрование данных и отправка на шлюз
$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);
?>
затем перейдите к передаче данных, только что отправленных в строке, и используйте их в представлении "Шлюз". Понятно?