HTTP Get上querystring中的可读数据

时间:2019-05-21 15:21:26

标签: asp.net-mvc encryption get model-validation

我们在网站上进行了渗透测试,他们说我们不应该在查询字符串(这是一个电子邮件地址)中传递可读数据。

当ModelState.isValid失败并由HTTP GET将模型返回到视图时,应用程序将创建查询字符串。有人告知我们应加密EmailAddress值(该站点为SSL)。

渗透结果:

GET /Membership/RegisterMe?__RequestVerificationToken=26Oajd6AG17YkHhyZz8-pArBuKEEer7V0b86f0aR_jHXs2JqYRE8NHvhz1zCcKWtQ6eVtxtdkTvC6HjG1ami2d-2CPn8Ieedwc77fIoMB941&EmailAddress=SomeOnesEmail.com

我们尝试通过在控制器中执行以下操作来转换提交后的值,因此,如果验证失败,它将在查询字符串中返回加密的值:-

 ModelState.Remove("EmailAddress");
 model.EmailAddress = Helpers.Encryption.Encrypt(model.EmailAddress);

但是它会丢失属性上的验证消息,例如,如果它是无效的电子邮件地址。

1 个答案:

答案 0 :(得分:0)

在视图中使用HTML Helpers的结果使在回发时更改模型值变得困难(验证失败)。它将始终以表单的形式从HTML帮助器返回原始值。您可以像这样更改它:-

    ModelState.Remove("EmailAddress"); 
    Model.EmailAddress = //new value; 

我的问题是我需要保留EmailAddress值,但在回发之前对其进行加密,因此该值不会在查询字符串中公开。上面的代码与使用ModelState并不一样。删除,您还将丢失验证消息(无效的电子邮件地址等)。

原因是因为格式为@ Html.TextBoxFor的HTML Helpers。将此更改为

<input type="text" name="EmailAddress"> 

然后您可以在回发之前更改控制器中的值,并保持验证错误

Model.EmailAddress = Encrypt(Model.EmailAddress);

回发值被加密,并且相应的验证错误消息在视图中显示给用户。然后在视图中执行一些简单的代码来解密Model.EmailAddress。