我正在构建一个处理付款的包装器。我们想记录请求,但不想存储敏感的信用卡数据。将传递一个类似于以下内容的查询字符串
amount=100.00&expMonth=01&expYear=14&cardnumber=4111111111111111
我想用X值掩盖信用卡号码的前12位数字。但是,cardnumber键并不总是在同一个位置。
我的第一个倾向是创建NameValueCollection
并检查密钥并执行string.format("XXXX-XXXX-XXXX-{0}", substring of the value
var qs = HttpUtility.ParseQueryString(request);
foreach (string key in qs)
{
if (key == "creditcard")
{
}
}
有人能指出我正确的方向吗?
我需要以相同的格式保存字符串,只需要屏蔽信用卡号。
答案 0 :(得分:0)
似乎是一种明智的方法,但在Get
上使用NameValueCollection
方法会更容易。像这样:
String maskedCardNumber = null;
var qs = HttpUtility.ParseQueryString(request);
var cardNumber = qs.Get("cardnumber");
if (cardNumber != null)
{
var substring = cardNumber.Substring(cardNumber.Length - Math.Min(4, cardNumber.Length));
maskedCardNumber = String.Format("XXXX-XXXX-XXXX-{0}", substring);
}
答案 1 :(得分:0)
这很有效,但可能会有一个更优雅的解决方案。
var maskedRequest = "";
var qs = HttpUtility.ParseQueryString(request);
foreach (string item in qs.AllKeys)
{
if (item != "cardnumber")
{
maskedRequest = maskedRequest + item + "=" + qs.Get(item) + "&";
}
else
{
maskedRequest = maskedRequest + item + "=" + string.Format("XXXX-XXXX-XXXX-{0}", qs.Get(item).Substring(12, 4)) + "&";
}
}
maskedRequest = maskedRequest.Remove(maskedRequest.Length - 1)