воскресенье, 25 марта 2012 г.

Проверка валидности суммы на счете пользователя

У вас есть web-сервер, в базе данных есть таблица, которая описывает зарегистрированного пользователя.
В этой таблице находится поле «сумма на счете».

Это может быть интернет-магазин, онлайн-игра и т.д.



Несмотря на явное отсутствие sql-инъекций необходимо контролировать сумму на счете пользователя.

Представим, что нехороший человек смог пополнить себе счет, и начинает (в случае онлайн-игры) покупать дорогие предметы (на нашу внутреннюю валюту) и делать другие не очень хорошие вещи.

Чтобы обезопасить себя от подобного, я предлагаю использовать следующий простейший алгоритм:

1. В таблице создать дополнительное поле, которое будет хранить специальным образом сформированную md5 сумму для счета пользователя.
2. Перед каждой денежной транзакцией проверять валидность денежной суммы с помощью md5 суммы.
3. В случае, если проверка не пройдет, не выполнять транзакцию и посылать уведомление администрации, иначе все в порядке и можно выполнять транзакцию.
4. После каждой транзакции обновлять md5 сумму.

Пример кода приведен на языке php:

Создание переменной $hash:

/*
$hash - хэш-сумма
$sum - сумма на счете пользователя
$salt - переменная "соль" (используется для вычисления md5-суммы, длина около 10-15 символов). Переменная необходима для того, чтобы в случае получения злоумышленником md5-суммы, была высокая сложность восстановления переменной $sum, используя радужные таблицы

*/
$hash = md5($salt . $sum);



Перед любой денежной транзакцией необходимо делать проверку:
// вычисляем текущую md5 сумму
// $sum и $hash считываем из базы данных

if(md5($salt . $sum) === $hash)
{
// выполняем транзакцию
// ...
// формируем новую md5-сумму
// считываем из базы данных (или на основании данных из предыдущего шага) новую сумму на счете пользователя ($new_sum)
$new_md5sum = md5($salt . $new_sum);
// обновляем значение md5 суммы в таблице базы данных для пользователя (теперь оно равно $new_md5sum)
// ...
}
else
{
// не выполняем транзакцию. Отправляем уведомление администрации
// ...
}

Комментариев нет:

Отправить комментарий