在MVC应用程序中验证表单引用器和令牌的位置



我在模型层验证了所有表单数据,但我也检查了我的表单是从哪里提交的(HTTP Referrer),我还用表单发送了一个令牌,以帮助防止跨站请求伪造,我的问题是这些检查应该在哪里完成?在控制器层还是在模型层?

我想到了一些不同的方法来实现这一点,其中一个是在我的AbstractController中有某种受保护的方法来验证表单源和发布令牌,但这样可能会破坏SRP。

(…)这些检查应该在哪里进行?在控制器层还是在模型层?

在我看来,CSRF保护应该在与其他形式的访问控制相同的级别上处理:在MVC三元组之外。

如果应用程序无法验证令牌,则意味着Request实例(或您的替代实例)中的数据不可信,因此需要废弃。我会在ControllerView实例的初始化之前执行这样的检查

基本上,用不同的意图多次检查数据是明智的。我建议这些级别:

1)前置控制器检查接收到的数据的完整性。如果你错过了一些令牌,或者从浏览器得到了一些超时等,你立即退出。您不会让这些请求到达您的MVC。这里可能需要suoshin原因是,深层可能会与浏览器通信安全数据,即使出现错误。假设有人错过了安全令牌(攻击?),您的视图返回一条错误消息并设置一些cookie。使用这些,攻击者可能会在任何无效的表单请求之后登录到。

2)前端控制器验证是否可以从该用户输入该表单等(例如,如果美国用户可能输入加拿大电话号码)。它可以以"请输入正确的电话号码"等形式给出直接反馈。

3)模型验证如果数据处于安全保存和返回的状态,例如,如果它已被转义,具有正确的长度等