如何为 php mvc 构建一个好的路由器

2024-04-01

我正在尝试 php mvc,但遇到了以下问题。我的请求和路由器类非常简单,我想扩展主题以处理来自子文件夹的控制器调用,并且控制器类函数应该能够拾取 url 变量发送它抛出 get 和 post。

我的路由器如下所示

class Router{

    public static function route(Request $request){


        $controller = $request->getController().'Controller';

        $method = $request->getMethod();

        $args = $request->getArgs();


        $controllerFile = __SITE_PATH.'/controllers/'.$controller.'.php';


        if(is_readable($controllerFile)){
            require_once $controllerFile;

            $controller = new $controller;


            if(!empty($args)){
                call_user_func_array(array($controller,$method),$args);
            }else{  
                call_user_func(array($controller,$method));
            }   
            return;
        }

        throw new Exception('404 - '.$request->getController().'--Controller not found');
    }
}

和请求类

    private $_controller;


    private $_method;

    private $_args;

    public function __construct(){

        $parts = explode('/',$_SERVER['REQUEST_URI']);


        $this->_controller = ($c = array_shift($parts))? $c: 'index';
        $this->_method = ($c = array_shift($parts))? $c: 'index';

        $this->_args = (isset($parts[0])) ? $parts : array();

    }

    public function getController(){

        return $this->_controller;

    }
    public function getMethod(){

        return $this->_method;

    }
    public function getArgs(){

        return $this->_args;
    }
}

问题是:当我尝试通过 ajax 发送变量到控制器方法时,由于其 url 结构,该变量无法被识别。 例如

index/ajax?mod_title=shop+marks&domain=example

只要看起来就被接受

index/ajax/shop+mark/example

您的代码包含所谓的LFI漏洞 http://en.wikipedia.org/wiki/File_inclusion_vulnerability#Local_File_Inclusion并且在目前的状态下是危险的。
您应该将可用作您的内容的内容列入白名单$controller,否则攻击者可能会尝试使用 NUL 字节指定某些内容,并可能在目录中包含不应该包含的文件,例如/etc/passwd,配置文件,等等。

您的路由器使用起来不安全;谨防!

编辑:白名单示例

$safe = array(
    'ajax',
    'somecontroller',
    'foo',
    'bar',
);
if(!in_array($this->_controller, $safe))
{
    throw new Exception(); // replace me with your own error 404 stuff
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 php mvc 构建一个好的路由器 的相关文章

  • 跟踪 PHP 对象属性更改

    我正在尝试跟踪对 PHP 变量所做的所有更改 该变量可以是对象或数组 例如 它看起来像 object array a b 然后使用对象缓存将该对象持久保存到存储中 当php脚本再次运行时 因此 当脚本第二次运行时 或者另一个脚本运行并修改该
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP Imagick - setTextEncoding() 函数不起作用

    我正在尝试在 Imagick 对象上添加一些文本 但是我使用 setTextEncoding 函数 它仍然不起作用 draw new ImagickDraw draw gt setTextEncoding utf 8 draw gt set
  • 如何开始 Zend Framework 开发

    Hai 首先谢谢 我下载了 Zend 框架 C wamp zend 我将 php ini 的包含路径更改为 C wamp zend 我在我的 php 信息中看到了这个 我认为包含路径是正确的 我仍然有很多疑问 我从哪里开始在 zend 框架
  • 如何对“2-1”这样的字符串进行数学计算以产生“1”?

    我只是想知道 PHP 是否有一个函数可以接受像这样的字符串2 1并产生它的算术结果 或者我必须手动执行此操作explode 获取算术运算符左侧和右侧的值 我知道这个问题很老了 但我昨晚在寻找不太相关的东西时遇到了它 而且这里的每个答案都很糟
  • 升级到 Yosemite 后 Apache 配置损坏

    昨天我升级到 Yosemite 现在我的 Web 开发本地配置不再起作用 我设法在下面设置了一个 userdir Users user public html我可以通过以下方式访问所有网站localhost user websitename
  • 如何在 WordPress 中添加 PHP 页面链接到我的页脚

    我创建了一个自定义 PHP 页面名称 privacy policy 名称为privacy php 我如何链接页脚中的页面 以便当有人点击隐私链接时页面打开 我已在此页面中调用页眉和页脚 这个怎么做 谢谢 In the wp content
  • Laravel 5.1 - 获取当前路线

    我正在开发一个为每个视图自动获取资源 css js 的函数 所以它工作得很好 让我们说 http mywebsite com displayitems http mywebsite com displayitems home about 等
  • 设置了 @version $Id$ 的 SVN Checkout

    我在 Subversion 中进行开发 在每个 PHP 文件的顶部都有以下注释块
  • Laravel eloquent 获取关系数

    我使用 Laravel 5 3 我有 2 张桌子 Articles id cat id title And Category id parent id title 我在模型中定义了我的关系 Article model public func
  • 将 WordPress 的登录/注册页面重定向到自定义登录/注册页面

    我有一个网站 有一个用户系统 我想将 WordPress 的用户系统集成到该网站的用户系统中 但我仍然想使用该网站的注册 登录页面 我不希望任何人能够使用 Wordpress 的登录或注册表单登录或注册 相反 当他们尝试访问 Wordpre
  • PHPmailer 发送垃圾邮件

    我刚刚更新了联系表单以使用 PHPMailer 来阻止电子邮件被标记为垃圾邮件 但没有成功 我正在使用这是一个相当简单的设置 但它仍然会进入人们的垃圾邮件 这是我的脚本 我想知道是否有人能说出哪里出了问题 include once inc
  • htmlspecialchars() 期望参数 1 为字符串,Laravel 中给出的数组

    我的程序中出现了这个错误Laravel刀片模板 htmlspecialchars 期望参数 1 为字符串 给定数组 我尝试将数组转换为刀片模板中的字符串 这是代码 Where silderImageDataArray是这里存储的变量和值 这
  • 使用以太坊 RPC 获取代币余额?

    如何通过以太坊RPC显示代币余额 id 0 data array data jsonrpc 2 0 data id id data method eth call data params from gt 0x0 to gt 0x0 data
  • 如何从 foreach(PHP) 中只获取一个结果

    该代码循环一个数组并显示用户的所有视图 现在情况发生了变化 我只需要显示 foreach 循环的一个结果 我怎么做 table class report edits table thead tr class dates row td div
  • Yii2 - 如何自动加载自定义类?

    我创建了以下自定义类 我想在我的 Yii2 应用程序中使用它 common components helper CustomDateTime php namespace common components helper class Cust
  • 使用 Facebook API 在朋友的墙上发布帖子

    我希望我的 Facebook 应用程序能够获取使用该应用程序的用户的 ID 并在他们的一位朋友的墙上找到该 ID 发布的帖子 我更喜欢使用个人 ID 的示例 而不是迭代所有朋友 我认为两个用户很可能都必须向应用程序提供权限才能执行此操作 这
  • XML 和 INI 哪个更快?

    我想知道 XML 是否比 INI 更快 反之亦然 我正在开发一个包含许多文件的网站 这个问题与我的问题有关关于包含许多文件 https stackoverflow com questions 7777522 too many include
  • PHP:switch 与 if [重复]

    这个问题在这里已经有答案了 哪种形式更有效率 这个 switch var case 1 break case 2 break 或者这个 if var 1 elseif var 2 在性能方面 性能方面完全无关 As PHPBench htt
  • 如何在 PHP 中去除字符串中的所有空格? [复制]

    这个问题在这里已经有答案了 我怎么能够strip remove all spaces of a string in PHP 我有一个string like string this is my string 输出应该是 thisismystr

随机推荐

  • 获取文本框中插入符号的位置

    如何获取 TextBox 控件可见客户区域中的插入符位置 x y 我需要向文本框添加自动完成功能 我发现了WPF 的解决方案 https stackoverflow com questions 1053539 finding the pos
  • Bash 'read' 命令在 Mac 上不接受 -i 参数。还有其他选择吗?

    我有一个 bash 脚本 在我的工作 Ubuntu 机器上运行良好 但遗憾的是 当我尝试在我的 Mac OSX Lion Mountain Lion 笔记本电脑上运行它时 它就崩溃了 杀死它的那行是这样的 while z SSHFS PAT
  • rufus cron 作业在 Apache/Passenger 中不起作用

    我有一个在 Apache Passenger 上运行的 Rails 应用程序 它有一个 rufus scheduler cron 作业 在后台运行并通过电子邮件发送通知 当我在 WEBrick 服务器上运行正在开发的应用程序时 电子邮件会像
  • 如何在地图视图中添加自定义标注视图

    我是 Objective C 中的 MapKit 新手 我可以在地图视图中添加自定义注释 我需要放置自定义标注视图 如下图所示 但我不明白如何设计这样的标注视图 我知道我需要在注释方法的视图中添加标注 MKAnnotationView ma
  • VB.net 中 json.net 的简单工作示例

    我从一个提供者那里得到了以下简化的 JSON 字符串 自从我使用 Visual Studio 和 vb Net 以来已经很长时间了 所以我很生疏 Venue ID 3145 Name Big Venue Clapton NameWithTo
  • 需要用Java将文件上传到S3上

    我最近开始在 AWS 上工作 我目前正在开发 S3 存储的上传功能 根据我的理解 可以有两种方法将文件上传到 S3 客户端的文件上传到我的服务器 我使用我的凭据将此文件上传到 S3 服务器 我还可以向客户端隐藏此信息 因为我不会显示上传详细
  • Java中识别具有相同内容的图像

    前段时间 我花了一些时间寻找如何确定两个图像是否相同的方法 以便回答这个问题 https stackoverflow com questions 8644960 java library to compare image similarit
  • 对于 Makefile 变量的每个目标

    我的 makefile 如下所示 apps app1 app2 app3 all dir app1 app2 app3 zip cleanup 现在我想在列表上做一些循环apps多变的 就像是 loop on apps endloop 是否
  • Leaflet:突然我收到此错误消息:无法加载资源:服务器响应状态为 403 ()

    突然我收到此错误消息 这对我来说很奇怪 因为我没有接触过地图部分 Failed to load resource the server responded with a status of 403 在寻找线索时 我发现了这个过时的信息 ht
  • 为什么按 Ctrl+“+”会在文本框中产生蜂鸣声?

    我正在与C and Windows Forms并想使用Ctrl Oemplus 作为一个函数key对于我的申请 我用一个German keyboard该键位于字母 P 右侧 2 个键 即 每当我按下此键与Ctrl重点是TextBox我听到一
  • 对象不包括列表理解中的方法

    这个问题与我之前的问题 https stackoverflow com questions 65021583 list comprehensions with class objects以及比尔的回应 我在 subfile py 中有一个名
  • MySQL 外键 - 如何强制跨表一对一?

    如果我在MySQL中有一个表代表一个基类 并且我有一堆表代表派生类中的字段 每个表都用外键引用回基表 有什么方法可以让MySQL强制派生表和基表之间的一对一关系 还是必须在代码中完成 以下面的快速 n 脏模式为例 有没有办法让MySQL确保
  • 评估 C/C++ 内存泄漏时的虚拟内存与物理内存

    我有一个 C 应用程序 我试图解决内存泄漏问题 但我意识到我并不完全理解虚拟内存和物理内存之间的区别 由于 导致的结果top 所以 16 8g 虚拟 111m 物理 4406 um 20 0 16 8g 111m 4928 S 64 7 2
  • Node.js JavaScript:在服务器上模拟按键(如宏)

    我正在尝试获取一个 node js 脚本来模拟按键 例如向上箭头或 a 按钮 具体来说 我正在尝试克隆Twitch 玩口袋妖怪 http www twitch tv twitchplayspokemon 基本上 每当通过 IRC 发送命令
  • 如何为 QVBoxLayout 小部件的隐藏/显示设置动画

    I have this horizontal layout of a QWidget subclass using QHBoxLayout 我希望顶部小部件以滑动动画隐藏 显示 我读过了本文 https qt project org for
  • 如何在 TypeScript 中链接/连接/关联两个类字段的类型?

    如何让 TypeScript 识别类中一个字段的值限制另一个字段的类型 示例代码 操场 https www typescriptlang org play code MYGwhgzhAEDCYBdoG9oAcCuAnLAKAlCgPQBUA
  • 将操作数放在 getopt() 的前面

    使用getopt C 中的函数 可以这样做 program a arg for a b arg for b c operand1 operand2 并且它的工作没有问题 但是 如何让它以这种方式工作 program operand1 ope
  • 如何找到 MIT 方案中出现错误的地方?

    当你在 MIT 方案中遇到错误时 它不会告诉你错误发生在哪里 例如 它只打印如下内容 Unbound variable top left To continue call RESTART with an option number REST
  • data.table 中多次转换时如何避免相同的列名?

    我尝试对同一列进行多次转换data table并发现这个答案 https stackoverflow com a 16367829 3409615 但是 如果我按照那里的步骤操作 我会得到相同的列名称 而不是mean Obs 1 etc l
  • 如何为 php mvc 构建一个好的路由器

    我正在尝试 php mvc 但遇到了以下问题 我的请求和路由器类非常简单 我想扩展主题以处理来自子文件夹的控制器调用 并且控制器类函数应该能够拾取 url 变量发送它抛出 get 和 post 我的路由器如下所示 class Router