我正在将使用传统页面控制器模式的应用程序转换为开始使用前端控制器模式。
我正在考虑的潜在问题之一是,使用前端控制器,攻击者可能直接调用任意函数。
例如,请求一个类似的 URLhttp://example.org/articles/read/123
会调用Articles::read( 123 )
,这是预期的,但攻击者可以请求http://articles/some_random_helper_method/123
,它会调用Articles::some_random_helper_method( 123 )
. 该方法可能会影响系统状态,或输出敏感信息等。
显然,诸如Articles::delete( 123 )
身份验证机制和随机数之类的东西,但可能有用于构建公共页面结果的辅助函数,但仍不应允许任意调用。
这似乎是一个常见问题,但我找不到任何关于它的讨论。
一种解决方案是实现命名约定(例如_private_method()
区分公共方法和私有方法,然后阻止调用与该约定匹配的方法。这就是 Code Ignitor 使用的方法。
但是,这对我不起作用,因为我正在转换现有应用程序,并且重命名所有方法会破坏向后兼容性。它也容易出现人为错误,因为它依赖于开发人员记住在方法不公开的情况下为其添加前缀。
另一种解决方案是将方法的可见性设置为公共或私有/受保护的,但这也可能会破坏我的上下文中的向后兼容性。
另一种解决方案是硬编码公共方法的白名单,但这似乎不是很优雅。
我想知道这个问题是否有规范的解决方案?