Nat*_*lor 9 cookies asp.net-mvc session hidden-field rijndaelmanaged
我有一个购物车的结账流程,当前用户在完成购买后,会在会话中存储信用卡数据以供检索.设置购买过程,使得用户输入信用卡,查看确认页面,然后完成订单.确认和终止操作是需要访问信用卡数据的唯一两个操作,并且为了安全,所有其他操作都应该丢弃它.
如果没有在基本控制器中进行反射来检查用户正在调用的当前操作,我想不出一种优雅的方法来丢弃不允许的请求上的数据.此外,如果用户在输入数据后未能提出另一个请求,它将在会话中停留,直到他们回到网站 - 每当发生这种情况时.我提出的一个建议是将数据加密到隐藏字段并依赖SSL票证来防止缓存标记.这似乎是一种相当安全的方法,但我不太喜欢将信用卡数据放在用户可访问的位置加密或不加密的想法.存储在数据库中是因为客户端不希望保存信用卡数据.
在多个页面请求中临时保存信用卡信息等敏感数据的理想方法是什么?
也许有人可以告诉我这是否是一个充分的方法.我已经设置了存储在会话中的购物车,每次创建对象时都会生成一个唯一的Guid,并且Guid用作加密和解密我使用Rijndael算法序列化的信用卡数据的密钥.然后,加密的卡数据在隐藏字段中传递给用户,并在单击完成后反序列化.最终结果是一个像这样的字符串:
VREZ%2bWRPsfxhNuOMVUBnWpE%2f0AaX4hPgppO4hHpCvvwt%2fMQu0hxqA%2fCJO%2faOEi%2bX3n9%2fP923mVestb7r8%2bjkSVZDVccd2AJzCr6ak7bbZg8%3d
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
mek*_*ian 11
处理此方案的最佳方法是使用支持两件事的支付服务:
授权允许您在收到付款信息时保留指定的费用金额,然后完成后,您可以在确认付款/订单后将费用提交到付款批次.如果订单被取消,您不必签发"完成",也可以尝试删除授权.
关于标记化,支持上述处理支付方法的大多数网关将为未决事务返回令牌,通常是数字ID.然后可以根据需要处理令牌,因为它对没有访问网关的身份验证凭据的任何人都没有价值.这也将安全负担转移到网关.
以除了将费用中继到网关/处理器之外的任何方式存储实际的信用卡信息是一个坏主意.除了保护数据的问题之外,这还将使您的应用程序进入PCI/PABP的卡信息存储范围,这需要您在应用程序中不需要处理的许多规则和规定.我相信,对于合规申请,明年还将收取监管费,据称是1万美元.所有这些对您或您的客户来说可能都不值得.
最后,在中间处理(页内/事件/路由处理程序)期间,您可以使用SecureString来保存数据的内容,直到您不再需要它们为止.
SecureString类(System.Security)@ MSDN
归档时间: |
|
查看次数: |
3468 次 |
最近记录: |