У меня есть процесс контроля для корзины, которая в настоящее время хранит данные кредитной карты на сессии для извлечения, после того как пользователь завершает покупку. Процесс покупки настраивается таким образом, что вводы данных пользователем кредитная карта, просматривает страницу подтверждения и затем завершает порядок. Действия подтверждения и завершения являются только двумя действиями, которые должны получить доступ к данным кредитной карты и быть безопасными, все другие действия должны отбросить их.
За исключением выполнения отражения в основном контроллере для проверки текущего действия звонит пользователь, я не могу думать об изящном способе отбросить данные по запрещенным запросам. Кроме того, если пользователь не выполнит другой запрос после ввода данных, то это задержится на сессии, пока они не возвратятся к веб-сайту - каждый раз, когда это происходит. Одно предложение, которое мне предложили, шифровало данные в скрытое поле и полагалось на билет на 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;
}
}