0

我正在构建一个包装器来处理付款。我们想记录请求,但不想存储敏感的信用卡数据。将传递一个查询字符串,类似于下面的内容

amount=100.00&expMonth=01&expYear=14&cardnumber=4111111111111111

我想用 X 值掩盖信用卡号的前 12 位数字。但是,卡号密钥并不总是在同一个位置。

我的第一个倾向是创建一个NameValueCollection并检查密钥并执行string.format("XXXX-XXXX-XXXX-{0}", substring of the value

var qs = HttpUtility.ParseQueryString(request);
foreach (string key in qs)
{
    if (key == "creditcard")
    {

    }
}

有人可以指出我正确的方向吗?

我需要以相同的格式保存字符串,只屏蔽信用卡号。

4

2 回答 2

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)
于 2013-12-27T22:32:09.100 回答
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);
}
于 2013-12-27T21:56:04.843 回答