На что обратить внимание при приёме денег на сайте?

Итак, делаю сайт, на котором будет своеобразная игровая валюта и покупка этой валюты за реальные деньги.
Так как дело касается реальных денег, хотелось бы обезопасить себя как можно сильнее.

Есть довольно большой опыт вебразработки, но с деньгами пока дела не имел.

Пока что в списке:
1. Трансакции наше всё
2. меня сильно пугает double spending. Хватит ли "UPDATE .... SET money=money+1", чтобы исключить эту воможность?
3. SQL injection, XSS знаем и любим, но вдруг чего забыл

Не подскажите ли ещё грабли, на которые можно наступить?
  • Вопрос задан
  • 2381 просмотр
Пригласить эксперта
Ответы на вопрос 3
AMar4enko
@AMar4enko
Покупатель вашей валюты не будет напрямую взаимодействовать с вашим платежным API, с ним будет взаимодействовать платежный шлюз.
Пользователь переходит на сайт платежной системы, там платит, платежная система отправляет вам уведомление о том, что такой-то заказ оплачен.

Так что обезопасивать тут особо-то и нечего.
Ваша задача сведется к тому, чтобы на API, на которое должен ходить только платежный шлюз, ходил только он - обычно в документации платежной системы всегда указаны их IP-адреса.
Ну и еще могут быть какие-нибудь MD5 хэши, основанные на вашем ключе API, которые вы сможете на стороне сервера проверить после получения сообщения об оплате от шлюза.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
1. Транзакции-то в БД оно понятно, что нужны. Но нужны ещё и программные локи при начале обработки. То есть начали процедуру оплаты - пишем в таблицу локов [lock_id, time_stamp] что-то вроде [order_23423563720234, 2014-08-22 12:21:05]. Закончили - удалили запись из таблицы локов. Так вы избежите задвоений в случае каких-то ошибок при обработке транзакций. + читайте далее.
2. Как вы уже поняли, нужна не только табличка операционных транзакций, но ещё и ордеров, к которым относятся транзакции. Соответственно, локи на ордеры жизненно необходимы, чтобы в один момент времени над конкретным ордером совершалась только 1 транзакция. Почему нужна такая связь один-ко-многим? Ну допустим возникнет ситуация опротестования транзакции. Как вы будете аннулировать заказ? Нужно делать транзакцию на реверс/рефанд, чтобы сохранить историю операций.

А на счёт double-spending не в курсе
Ответ написан
Комментировать
kompi
@kompi
nullstack devoops
2. Не понятно, в чем именно проблема? После прихода ответа оп ПС, транзакция должна закрываться, а повторный/поддельный ответ должны игнорироваться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы