【问题标题】:How to mask password exist in json string?如何屏蔽 json 字符串中存在的密码?
【发布时间】:2021-06-26 02:23:45
【问题描述】:

我正在为我的 API 响应开发 .net core c# 日志记录项目。 输出为 JSON 格式,响应包含敏感信息(例如密码)

当响应输出包含更复杂的带有数组的 Json 结构时,我被卡住了,其项目是复杂对象,每个对象都有一个“id”属性和表示敏感字段的关键字,显示为该“id”字段的值(请参阅下面的示例)。

对于以下输出,如果 "id" 的值包含单词 'password' ,我如何使用 RegEx 将密码值替换为 'XXXX' 。例如...下面有需要屏蔽的值...


{
    "type": "CatalogResourceRequest",
    "description": null,
    "reasons": null,
    "data": {
        "customProperties": [
            {
                
                "data": {
                    "id": "CloneFrom",
                    "is_hidden": false,
                    "value": "TMPLABC"
                }
            },
            {
                
                "data": {
                    "id": "Debug",
                    "is_hidden": false,
                    "value": false
                }
            },
            {
                "data": {
                    "id": "abc_password",
                    "is_hidden": false,
                    "value": "This_Is_Password_To_Be_Masked"
            },

                "data": {
                    "id": "password_of_user1",
                    "is_hidden": false,
                    "value": "This_Is_Password_To_Be_Masked_Also"
                        }           
        }                   
    ]
    }
}

【问题讨论】:

标签: c# json regex asp.net-core


【解决方案1】:

这是一个使用 Json.Net 的工作演示:

[HttpGet]
public IActionResult Index()
{
    var data = System.IO.File.ReadAllText("test.json");
    var json = ToObject(data);
     

    return Ok(json);
}
public object ToObject(string json)
{
    if (string.IsNullOrEmpty(json))
        return null;
    return ToObject(JToken.Parse(json));
}

public object ToObject(JToken token)
{
    switch (token.Type)
    {
        case JTokenType.Object:
            return token.Children<JProperty>()
                        .ToDictionary(prop => prop.Name,
                                        prop => ToObject(prop.Value),
                                        StringComparer.OrdinalIgnoreCase);
        case JTokenType.Array:
            return token.Select(ToObject).ToList();
        case JTokenType.Null:
            return null;
        default:
            if(((JValue)token).Value.ToString().Contains("password"))
            {
                ViewBag.Id = true;
                return ((JValue)token).Value;
            }
            if(((JProperty)token.Parent).Name== "value" && ViewBag.Id!=null)
            {
                if(ViewBag.Id)
                {
                    ViewBag.Id = false;
                    return "XXXXX";
                }
                return ((JValue)token).Value;
            }
            return ((JValue)token).Value;
    }
}

顺便说一句,您提供的 json 不正确,应该如下所示:

{
  "type": "CatalogResourceRequest",
  "description": null,
  "reasons": null,
  "data": {
    "customProperties": [
      {

        "data": {
          "id": "CloneFrom",
          "is_hidden": false,
          "value": "TMPLABC"
        }
      },
      {

        "data": {
          "id": "Debug",
          "is_hidden": false,
          "value": false
        }
      },
      {
        "data": {
          "id": "abc_password",
          "is_hidden": false,
          "value": "This_Is_Password_To_Be_Masked"
        }
      },
      {
        "data": {
          "id": "password_of_user1",
          "is_hidden": false,
          "value": "This_Is_Password_To_Be_Masked_Also"
        }
      }
    ]
  }
}

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2017-12-15
    • 2021-12-03
    相关资源
    最近更新 更多