关闭表单/ POST字段的请求验证的实际危险?

时间:2015-01-13 15:22:49

标签: .net asp.net-mvc-4 validation

我们有一个ASP.NET MVC应用程序,目前正在运行某些情况,其中(随机生成的)用户密码包含“危险的”跨站点脚本字符序列(例如“<?”和“&lt ;! “,请参阅List of Input Values which will cause the "A potentially dangerous Request.Form value was detected..." error以获取有关所有问题的讨论。”

我们希望允许用户继续使用这些字符串作为其密码的一部分,但也不会让自己暴露于任何合法的脚本威胁。

登录凭据以(Razor视图)形式收集,并通过HttpPost(通过TLS)提交。我们处理MVC Action(C#)哈希用户标识符和密码,然后查询数据库(通过EntityFramework和LINQ)获取具有该哈希值的记录(为了避免哈希冲突,还有更多内容,但没有用户 - 输入的值将传递给DB)。

我们知道我们可以在各个级别(http://msdn.microsoft.com/en-us/library/hh882339(v=vs.110).aspx)禁用请求验证,但无法找到关于风险实际所在位置的任何明确讨论。

由于危险值(明文密码)是通过POST而不是GET提交的,我假设从客户端到服务器的传输过程中没有风险。

由于我们在对C#进行任何其他操作之前对C#中的值进行散列,以及使用EntityFramework而不是构建即席查询,并且从不在HTML中显示用户输入的值,我假设没有我们处理/行动期间的风险。

事实上,如果我正确理解了请求验证的目标,那么如果我们禁用请求验证并且使用用户输入执行以下操作之一,那么我们只会暴露自己的风险:

  • 具有值(例如string sql = "SELECT * FROM tbl WHERE f='" + user_value + "'; // this is ALWAYS a terrible idea
  • 的非参数化临时SQL查询
  • 网络服务电话或GET重定向(例如Response.Redirect("https://domain.tld/api/svc?param=" + user_value);
  • 使用/显示生成的HTML / JS / CSS / XML /等中的值(例如<p>Entered: @Model.PlaintextPassword</p>

是否存在其他风险,即我在缺少的小规模(特定字段或操作,而不是整个项目/网站)上禁用请求验证?上面列出的登录页面方案是否有效禁用此验证,或者我们是否应该在发布之前找到对值进行编码的方法?

0 个答案:

没有答案