2012-11-26 53 views
2

他们在URL中使用类名和/或参数时是否存在任何安全问题?URL类别/方法路由的安全

我创建了一个简单的PHP页面路由器的路由路径,例如:

www.mysite.com/classname/methodname/param1/param2/etc/etc 

是否有泄露我的类和方法的名称的任何危险?还是应该在类方法中有足够的过滤来使其不成问题?

此外,我的AJAX调用将以相同的方式路由。为了确保合法的AJAX调用,我可以以何种方式生成每次调用时都会更改的会话标记。例如,在由AJAX访问的PHP脚本中生成一个随机数,该脚本也由该调用发送。如果它们匹配,那么它的授权请求。唯一的问题是我如何让他们匹配?

+0

为什么不重用像Symfony2 [Routing](http://symfony.com/doc/current/components/routing/introduction.html)和[Http Foundation](http://symfony.com)这样经过良好测试的稳健组件。 /doc/master/components/http_foundation/introduction.html)。 – ChocoDeveloper

+0

@ChocoDeveloper谢谢,我知道alr​​ady有很多解决方案,但如果我试着自己做第一个,我会更好地理解它们和URL路由概念。 – imperium2335

+0

你仍然应该检查出来。阅读别人怎么做会给你很多想法。例如,为方法添加一些类似'Action'的内容很常见,以防止访问不应通过URL访问的公共方法。因此,例如,如果您收到'user/profile',则应该创建User类并调用方法'profileAction'。如果你不添加'Action',攻击者可以尝试调用'deleteUser',你就明白了。 – ChocoDeveloper

回答

2

最大的安全问题是,你不能盲目包括类名称,如:

require_once('classes/' . $_GET['class'] . '.php'); 

以上将是一个脆弱的例子,所以一定要验证类名或你有这样的文件避免本地文件包含漏洞。

class_exists()将是不够的。我会先验证它,以便它只包含a-z。然后使用file_exists,class_exists等

我想不是所有的类和方法都会被公众通过路由使用,所以有一些系统可以检查路由器是否被允许访问指定的类和方法。这可以通过多种方式完成,例如从基类中派生公开可用的类,例如, BaseController,并检查包含的类是否源自该类,或者将控制器保存在内部类的单独目录中,并根据需要控制类中的访问。

至于揭示你的类和方法 - 这不是真的关心,实际上它是大多数MVC框架的工作原理。确保你验证了用户输入的所有内容。

对于您的AJAX建议,可以通过在会话中存储令牌来完成,以便您可以在调用时检查它是否匹配。我认为这不会增加很多安全性。通常,AJAX服务会提供与页面上可用的相同的数据。

+0

谢谢你。那么为了避免这种漏洞,我可以在我的前端控制器中使用class_exists()和method_exists()函数吗? – imperium2335

+0

@ imperium2335看我的编辑:我会检查'a-z',然后检查是否可以从URL /路由器访问该类。 – MrCode