C# Checkmarx堆检查漏洞WebAPI
我已经构建了一个ASP.NET WebAPI 2应用程序,我的一个控制器有一个允许用户登录的方法,类似这样的方法: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
[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[]数组)……然后我在代码中清空这个字符串……尽管这没有多大作用(但它在代码中显示我尝试过/关心过)。。。。。。。。。。。。