我们在网站上进行了渗透测试,他们说我们不应该在查询字符串(这是一个电子邮件地址)中传递可读数据。
当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);
但是它会丢失属性上的验证消息,例如,如果它是无效的电子邮件地址。
答案 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。