mask查询动态查询字符串值

时间:2013-12-27 21:44:56

标签: c# asp.net query-string namevaluecollection

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

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")
    {

    }
}

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

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

2 个答案:

答案 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)