Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Checkmarx堆检查漏洞WebAPI_C#_Security_Asp.net Web Api2_Checkmarx_Secure Coding - Fatal编程技术网

C# Checkmarx堆检查漏洞WebAPI

C# Checkmarx堆检查漏洞WebAPI,c#,security,asp.net-web-api2,checkmarx,secure-coding,C#,Security,Asp.net Web Api2,Checkmarx,Secure Coding,我已经构建了一个ASP.NET WebAPI 2应用程序,我的一个控制器有一个允许用户登录的方法,类似这样的方法: [Route("login")] [HttpPost] [SwaggerOperation(Tags = new[] { "ACCOUNT" })] [SwaggerResponse(HttpStatusCode.OK, Type = typeof(ReturnModel<AccountModel, HttpStatusCode>))] public HttpRespo

我已经构建了一个ASP.NET WebAPI 2应用程序,我的一个控制器有一个允许用户登录的方法,类似这样的方法:

[Route("login")]
[HttpPost]
[SwaggerOperation(Tags = new[] { "ACCOUNT" })]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(ReturnModel<AccountModel, HttpStatusCode>))]
public HttpResponseMessage Login([FromBody]LoginDto userData)
{
   ReturnModel<AccountModel, HttpStatusCode> returnObj = new ReturnModel<AccountModel, HttpStatusCode>();

   try
   {
      returnObj = accountService.Login(userData.UserLogin, userData.UserPassword);

      if (returnObj.Success)
      {
         ...
      }
      else 
      {
         ...
      }

      return Request.CreateResponse(returnObj.StatusCode, returnObj);
   }
   catch (Exception ex)
   {
      LogUtil.Error(ex);
      return Request.CreateResponse(HttpStatusCode.InternalServerError, returnObj);
   }
}
public class LoginDto
{
   [Required]
   public string UserLogin { get; set; }

   [Required]
   public string UserPassword { get; set; }
}
在使用Checkmarx工具进行漏洞检查后,我收到一份报告,报告中说:

第55行的方法索引 //***/Controllers/AccountController.cs 定义UserPassword,指定它包含用户密码。 然而,虽然明文密码后来被分配给UserPassword, 此变量永远不会从内存中清除

我知道字符串是不可变的,并在内存中保留不确定的时间

该工具(checkmarx)有一个建议说:

具体建议-.NET:

[Route("login")]
[HttpPost]
[SwaggerOperation(Tags = new[] { "ACCOUNT" })]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(ReturnModel<AccountModel, HttpStatusCode>))]
public HttpResponseMessage Login([FromBody]LoginDto userData)
{
   ReturnModel<AccountModel, HttpStatusCode> returnObj = new ReturnModel<AccountModel, HttpStatusCode>();

   try
   {
      returnObj = accountService.Login(userData.UserLogin, userData.UserPassword);

      if (returnObj.Success)
      {
         ...
      }
      else 
      {
         ...
      }

      return Request.CreateResponse(returnObj.StatusCode, returnObj);
   }
   catch (Exception ex)
   {
      LogUtil.Error(ex);
      return Request.CreateResponse(HttpStatusCode.InternalServerError, returnObj);
   }
}
public class LoginDto
{
   [Required]
   public string UserLogin { get; set; }

   [Required]
   public string UserPassword { get; set; }
}
-与其将密码存储在不可变的字符串中,不如使用加密的内存对象,如SecureString或ProtectedData。

我发现其他建议也要求我使用SecureString而不是string来操作/存储用户密码,但我认为这只适用于MVC或WPF应用程序,我不知道如何在ASP.NET WebAPI 2上下文中应用这一点,因为我必须公开一个与语言无关的服务


有人对如何在ASP.NET WebAPI 2上实现这种级别的安全性(甚至是可能的)有什么建议吗?

@DaveM,谢谢你的链接,但我认为这不是完全相同的情况。在我的例子中,我不知道谁是API客户端(Angular、IOS、Android…)。我主要关心的是,如何实现SecureString,或者如何在语言不可知的REST API中应用相同的UserPassword概念(或者如果可能的话)?API客户端与此问题无关,无论客户端是什么,请求都以http形式进入应用程序。无论您的web api如何,您已经是语言不可知论者implemented@DaveM,但要使用SecureString实现这一点,我必须在不使用字符串的情况下将密码从客户端传递到服务器(例如,在WPF中,客户端上有这种类型)。SecureString实现建议我必须将每个键入字符的信息从客户端发布到服务器。如果我在这个过程中以任何方式使用字符串(可能会发送一篇文章来输入字符),我会在内存中再次使用字符串上的密码,甚至是碎片…嗯,你不能“解决”这个问题,你只能尽量减少暴露。我对“通过电线发送”也有同样的问题。。Oauth2客户机的秘密。对于http请求,它必须是字符串。所以我能做的最多。。只要我能,就保留这个秘密值(在dotnet中作为securestring,在java中作为char[]数组)……然后我转换成string,使用这个值(然后我销毁/覆盖securestring/char[]数组)……然后我在代码中清空这个字符串……尽管这没有多大作用(但它在代码中显示我尝试过/关心过)。。。。。。。。。。。。