【问题标题】:mask query dynamic query string value掩码查询动态查询字符串值
【发布时间】:2013-12-27 21:44:56
【问题描述】:

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

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

    }
}

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

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

【问题讨论】:

  • 旁注:考虑不要将敏感信息放入可能被用户复制粘贴的 Url... 通常此类请求是通过发布并将信息放入字段中完成的(以及某种重放/ CSRF 保护)
  • 它实际上不是通过查询字符串进入的。它将通过请求的正文进入。它只是以查询字符串格式传递
  • 为什么不使用常规的 ASP.Net (WebForms/MVC) 机制呢?无论如何 - 请查看 stackoverflow.com/questions/829080/…,它显示了如何重新构建它。
  • 你使用什么数据库/ORM?

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


【解决方案1】:

似乎是一种明智的方法,但也许在NameValueCollection 上使用Get 方法会更容易。像这样:

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);
}

【讨论】:

  • 很好的解决方案,但现在我需要将它们重新组合在一起。字符串需要使用被屏蔽的信用卡以原始格式保存
【解决方案2】:

这很好用,不过可能有更优雅的解决方案。

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)

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多