Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在哪里验证MVC应用程序中的表单引用器和令牌?_Php_Security_Model View Controller - Fatal编程技术网

Php 在哪里验证MVC应用程序中的表单引用器和令牌?

Php 在哪里验证MVC应用程序中的表单引用器和令牌?,php,security,model-view-controller,Php,Security,Model View Controller,我在模型层验证了我的所有表单数据,但我也检查了我的表单是从哪里提交的(HTTP Referer),我还随表单发送了一个令牌,以帮助防止跨站点请求伪造,我的问题是这些检查应该在哪里进行?在控制器中还是在模型层中 我想出了几种不同的方法来实现这一点,其中一种是在我的AbstractController中使用某种受保护的方法来验证表单源代码和发布的令牌,但这可能会破坏SRP (……)这些检查应该在哪里进行?在控制器中还是在模型层中 都不是 依我拙见,CSRF保护应与其他形式的访问控制在同一级别上处理:

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

我想出了几种不同的方法来实现这一点,其中一种是在我的
AbstractController
中使用某种受保护的方法来验证表单源代码和发布的令牌,但这可能会破坏SRP

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

都不是

依我拙见,CSRF保护应与其他形式的访问控制在同一级别上处理:在MVC triad之外。


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

基本上,明智的做法是以不同的意图多次检查数据。我建议这些水平:

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

2) 前端控制器验证该用户是否可以在该表单中输入输入的电话号码等(例如,如果美国用户可能输入加拿大电话号码),有必要以“请输入正确的电话号码”等形式提供直接反馈


3) 模型验证数据是否处于安全保存和返回的状态,例如数据是否已转义、长度是否正确等。

我投票支持控制器。。。模型不应该绑定到它正在使用的环境。如果你将检查塞进模型中,那么你会如何在cron作业中使用这些模型。您要么允许空引用者并使自己容易受到攻击,要么不允许他们并为合法用户破坏您的应用程序。同步器令牌是击败CSRF的有效措施;推荐人检查不是。确切地说,CSRF令牌没有验证某些用户执行某些操作的权限。它正在验证应用程序本身中通信的完整性,应该这样对待。