我们有一个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
)Response.Redirect("https://domain.tld/api/svc?param=" + user_value);
)<p>Entered: @Model.PlaintextPassword</p>
)是否存在其他风险,即我在缺少的小规模(特定字段或操作,而不是整个项目/网站)上禁用请求验证?上面列出的登录页面方案是否有效禁用此验证,或者我们是否应该在发布之前找到对值进行编码的方法?