gburtini/router

一个非常简单且轻量级的路由系统,能够实现安全的顺序回退/优先级。所有变量都被视为未被污染。在开始使用之前,您应该阅读代码(或者在GitHub页面上的至少“安全”)!

0.0.0 2015-04-04 17:55 UTC

This package is auto-updated.

Last update: 2024-09-05 02:54:05 UTC


README

回退友好路由工具。

在使用此工具之前,您可能想先查看https://github.com/chriso/klein.php

总的来说,这里的理念是将文件系统用作核心路由功能。最常见的架构大致如下

  • 使用mod_rewrite或类似的工具,将所有流量路由到解析器和初始化脚本。
  • 解析出预期的“路由”和变量。请对路由进行白名单验证。
  • 使用Route::map将路由映射到适当的文件(通常是“控制器”文件),并根据需要将白名单变量作为“参数”传入。
  • 执行控制器操作。
  • 使用Route::map将路由映射到适当的模板文件,并使用白名单变量输出最终模板。

安装

您需要的一切都包含在单个文件router.php中,但最方便的安装方法是使用composer。

composer require gburtini/router

使用方法

使用::types调用设置有效的路由类型。键是类型的指示符,值是不带尾斜杠的路径。路径“/”是不被接受的。空路径“”是可接受的,但不推荐,因为至少您可能会陷入无限循环(您也无法控制哪些文件被路由)。

Route::types(['controller'=>'files/controllers', 'template'=>'files/templates']);

设置文件的有效扩展名。这是防止加载不良文件的安全措施之一。默认情况下,此设置为["php"]

Route::extensions(["tpl", "html"]);

当您想要调用路由时,调用::map::%type name%::map将按优先级顺序接收要路由的类型数组。单个路由调用只会路由到一个文件。

Route::map(['controller', 'template'], 'dashboard');

如果您不需要回退功能(控制器不存在时先执行控制器然后执行模板),您可以使用解释器钩子/魔法方法直接使用您已建立的类型。

Route::template("dashboard");

安全

简而言之:当您不确定时,您应该确保传递给路由的所有变量都是未被污染的、安全的、安全的。验证做得非常少。

Route::types不进行验证。路径不会被验证以避免危险、空或根。Route::map和相关函数(魔法方法、Route::mapFile)不会阻止您包含危险文件。具体来说

  • 如果选择具有空路径的类型,路径将从“/”开始
  • 如果映射的第二个参数(魔法方法的第一个参数)为空,路由器将胆怯地拒绝尝试加载它。
  • 如果映射的第二个参数包含“..”,它将按预期向上导航路径。如果您不希望这样做,您应该白名单。如果您不想白名单,可以修改代码以使用realpath来验证前缀。
  • 到::map的第三个参数接收一个参数映射,用于在包含的文件中展开。目前,这使用extract(., EXTR_SKIP)来展开映射。EXTR_SKIP意味着在映射函数内使用的任何变量(包括$path$load)都不能传递。这本身不是一个安全风险(在路由器中可能是,在您的代码中可能是!)但您应该为所有传递的变量使用前缀(或修改代码以支持更通用的提取机制)。
  • 还有更多考虑因素,大部分与路径有关。您应该在使用它之前阅读代码。此代码不太可能适用于当前所有目的。

许可协议

版权所有 (C) 2015 Giuseppe Burtini

本程序是自由软件:您可以重新分发和/或修改它,前提是您必须遵守自由软件基金会发布的GNU通用公共许可证的条款,无论是许可证的第2版,还是(根据您的选择)任何后续版本。

本程序的分发旨在使其有用,但没有任何保证;甚至不提供适销性或特定用途适用性的隐含保证。有关详细信息,请参阅GNU通用公共许可证。

您应已收到随本程序一起提供的GNU通用公共许可证副本。如果没有,请参阅https://gnu.ac.cn/licenses/