Как безопасно передавать информацию о кредитной карте между страницами в PHP - PullRequest
7 голосов
/ 28 марта 2010

Как безопасно передавать информацию о кредитной карте между страницами в PHP? Я создаю приложение для электронной коммерции и хотел бы, чтобы пользователи проходили проверку следующим образом:

Ввод информации -> Просмотр -> Завершение заказа

Проблема в том, что я не уверен, как безопасно передавать кредитную информацию с момента, когда пользователь вводит ее, когда я ее обрабатываю (на этапе «Завершить заказ»). Я слышал, что использование сессий небезопасно, даже с шифрованием.

Любая помощь будет оценена!

Ответы [ 6 ]

10 голосов
/ 28 марта 2010

Я бы нигде не хранил это. Это слишком рискованно и, вероятно, не этично.

Отправьте запрос в платежный шлюз, отправив форму через https и сохранив только результат транзакции.

Возможно, вам важно только, чтобы транзакция была одобрена или отклонена. Кого волнует, что это за номер?

8 голосов
/ 28 марта 2010

Не храните информацию о кредитной карте в сеансе, не храните ее в базе данных, не храните в файле. Вместо этого запишите информацию о cc обратно на страницу рецензирования в виде скрытых вводов html.

Таким образом, поток программы будет работать так:

  1. Пользователь отправляет платежную и платежную информацию на сервер через HTML-форму.
  2. Сервер проверяет, что эта информация имеет правильный формат (т. Е. Кредитная карта имеет соответствующее количество цифр, был введен платежный адрес и т. Д.)
  3. После проверки сервер записывает обратно всю информацию, представленную как скрытые поля ввода формы. Это включает в себя адрес для выставления счетов, адрес доставки и информацию о кредитной карте.
  4. Форма на странице обзора (со скрытыми полями ввода) имеет кнопку с надписью «Завершить заказ» / «Завершить заказ». Эта форма обзора публикуется в сценарии оформления заказа.
  5. Скрипт финализации хранит информацию о выставлении счетов / доставке в вашей базе данных и передает информацию о кредитной карте на ваш платежный шлюз.

Преимущества этого метода двояки:

  1. Вы экономите накладные расходы и затраты на дополнительное соответствие PCI, которое требуется при хранении кредитной информации.
  2. Этот метод находится в пределах безопасности протокола SSL. Это означает, что зашифрованная информация о кредитной карте должна быть передана на ваш сервер в любом случае - этот метод по-прежнему зависит исключительно от эффективности SSL, без введения сложностей с сохранением данных кредитной карты.

Последнее замечание вызывает еще одну проблему - имея страницу обзора, вы удваиваете количество раз, когда зашифрованные данные кредитной карты передаются по сети. При использовании этого метода требуется минимум 4 передачи: клиент-сервер, сервер-клиент, клиент-сервер (снова), а затем сервер-шлюз. Без рассмотрения есть минимум 2 передачи: клиент-сервер и сервер-шлюз. Оправдывает ли удобство обзорная страница риск дополнительных передач? Это решение, которое вы, как веб-разработчик (и ваш клиент), должны принять.

1 голос
/ 26 июня 2010

Одной из альтернатив является использование службы профиля оплаты, такой как Менеджер информации о клиентах Authorize.net (есть и другие). Вы сохраняете информацию об оплате в профиле через их API, а затем используете идентификатор профиля при фактической зарядке карты. Таким образом, вы никогда не будете хранить данные на своих серверах.

1 голос
/ 28 марта 2010

Ну, во-первых, вы должны использовать протокол HTTPS, чтобы обеспечить шифрование соединения.

После этого вы можете хранить данные в суперглобальном $_SESSION. Данные хранятся на ваших серверах, поэтому они относительно безопасны.

Вы можете сделать аналогичный метод, когда вставляете информацию в базу данных Order, где ключ представляет собой GUID или что-то еще, довольно случайное и уникальное. Затем, когда человек собирается изменить / просмотреть свой заказ, вы должны сохранить идентификатор заказа в части URL GET (или, если вы параноик, переменную cookie / session):

 https://example.com/order?orderID=akjgflkhaslasdfkjhalsdjkljahs

Для обеспечения дополнительной безопасности вы также можете сохранить IP-адрес в таблице заказов и убедиться, что IP-адрес и идентификатор заказа совпадают.

0 голосов
/ 26 июня 2010

Думаю, мне придется согласиться. Хранение номеров кредитных карт является слишком большим риском, и последствия могут быть надуманными.

Идеальный способ - передать информацию стороннему процессору и просто использовать полученный результат для формирования логики вашего скрипта.

if (transaction){
     // code goes here
}
else{
     // code goes here
}

Надеюсь, вы поняли ...:)

0 голосов
/ 28 марта 2010

Не моя область знаний, но я думаю, что вы хотите сохранить его в сеансе, но также использовать «синхро-токен» (или как его называют дети в наши дни), чтобы избежать атак CSRF.

Конечно, вы хотите использовать https (правильно), избегая конфиденциальных данных в URL-адресах и скрытых полях, избегая размещения очень конфиденциальной информации в любом ответе и т. Д. И т. Д. И т. П.

...