ASP.NET MVC - Защитите временное хранение данных кредитной карты

У меня есть процесс контроля для корзины, которая в настоящее время хранит данные кредитной карты на сессии для извлечения, после того как пользователь завершает покупку. Процесс покупки настраивается таким образом, что вводы данных пользователем кредитная карта, просматривает страницу подтверждения и затем завершает порядок. Действия подтверждения и завершения являются только двумя действиями, которые должны получить доступ к данным кредитной карты и быть безопасными, все другие действия должны отбросить их.

За исключением выполнения отражения в основном контроллере для проверки текущего действия звонит пользователь, я не могу думать об изящном способе отбросить данные по запрещенным запросам. Кроме того, если пользователь не выполнит другой запрос после ввода данных, то это задержится на сессии, пока они не возвратятся к веб-сайту - каждый раз, когда это происходит. Одно предложение, которое мне предложили, шифровало данные в скрытое поле и полагалось на билет на SSL для предотвращения кэширования разметки. Это походит на довольно безопасный подход, но я не очень люблю идею поместить данные кредитной карты в доступное для пользователя зашифрованное местоположение или нет. Хранение в базе данных отсутствует, потому что клиент не хочет сохраненные данные кредитной карты.

Что идеальный подход к временному сохранению уязвимых данных как данные кредитной карты через запрос больше чем на одну страницу?


Возможно, кто-то может сказать мне, если это - достаточный подход. Я установил свою Корзину, которая хранится на сессии, чтобы иметь уникальный Гуид, генерировал каждый раз, когда объект является newed, и тот Гуид используется в качестве ключа, чтобы зашифровать и дешифровать данные кредитной карты, которые я сериализирую с алгоритмом Rijndael. Зашифрованные данные карты затем передаются пользователю в скрытом поле и десериализовываются, после завершают, нажат. Конечным результатом является строка во многом как это:

VREZ%2bWRPsfxhNuOMVUBnWpE%2f0AaX4hPgppO4hHpCvvwt%2fMQu0hxqA%2fCJO%2faOEi%2bX3n9%2fP923mVestb7r8%2bjkSVZDVccd2AJzCr6ak7bbZg8%3d

public static string EncryptQueryString(object queryString, Guid encryptionKey)
{
    try
    {
        byte[] key = Encoding.UTF8.GetBytes(ShortGuid.Encode(encryptionKey).Truncate(16));//must be 16 chars
        var rijndael = new RijndaelManaged
                           {
                               BlockSize = 128,
                               IV = key,
                               KeySize = 128,
                               Key = key
                           };

        ICryptoTransform transform = rijndael.CreateEncryptor();

        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
            {
                byte[] buffer = Encoding.UTF8.GetBytes(queryString.ToString());

                cs.Write(buffer, 0, buffer.Length);
                cs.FlushFinalBlock();
                cs.Close();
            }
            ms.Close();
            return HttpUtility.UrlEncode(Convert.ToBase64String(ms.ToArray()));
        }
    }
    catch
    {
        return null;
    }
}

9
задан SwDevMan81 24 January 2010 в 19:41
поделиться