PHP - 保护URL中传递的参数

时间:2009-01-07 09:38:50

标签: php security validation cakephp

我有一个应用程序根据URL的一部分做出决定:

    if ( isset($this->params['url']['url']) ) {
    $url = $this->params['url']['url'];
    $url = explode('/',$url);
    $id = $this->Provider->getProviderID($url[0]);

    $this->providerName = $url[0]; //set the provider name

    return $id;

    }

这恰好是在蛋糕应用中,所以$ this-> params ['url']包含一个URL元素。然后我使用URL的元素,以决定在我的应用程序的其余部分中使用哪些数据。我的问题是......

什么是保证这种输入的最佳方式,以便人们无法传递任何令人讨厌的东西?

谢谢,

6 个答案:

答案 0 :(得分:1)

什么是有效的提供商名称?测试URL参数是否为1,否则拒绝它。

希望您知道绝对没有办法阻止用户提交任何内容,包括他们不应该使用的提供者名称。

答案 1 :(得分:1)

我会重复Karsten的评论:定义“任何讨厌的东西”

您期望参数是什么?如果您希望它是一个URL,请使用正则表达式来验证URL。如果您期望一个整数,请将其强制转换为整数。浮点数,布尔值等也是如此。

这些PHP函数可能会有所帮助: www.php.net/strip_tags www.php.net/ctype_alpha

答案 2 :(得分:1)

参数将是providername - 字母数字字符串。我认为答案基本上是使用ctype_alpha()结合检查提供者名称是否有效,基于其他应用程序逻辑。

感谢回复

答案 3 :(得分:1)

这里的其他注释是正确的,在AppController的beforeFilter中根据数据库中的提供程序验证提供程序。

但是,如果所有网址都应以提供商字符串作为前缀,那么您将通过查看$ this-> params ['url']以错误的方式从网址中提取它。

这种问题正是路由器类的问题,它能够将params传递给一个动作。查看食谱http://book.cakephp.org/view/46/Routes-Configuration中的手册页。你可能会尝试类似的东西:

Router::connect('/:provider/:controller/:action');

您还可以在手册中看到通过正则表达式验证路由本身的提供者参数的能力 - 如果您有一个明确的已知提供者列表,则可以在路由正则表达式中对这些进行硬编码。

通过设置捕获此部分URL的路径,它立即可用于$ this-> params ['provider'],但更好的是html helper link()方法自动构建格式正确的URL,例如

$html->link('label', array(
  'controller' => 'xxx',
  'action' => 'yyy',
  'provider' => 'zzz'
));

返回/ zzz / xxx / yyy

之类的链接

答案 4 :(得分:0)

此外,如果您有一组已知的允许网址,那么最好将这些允许的网址列入白名单。您甚至可以通过使用包含允许的URL的数据库表来动态地执行此操作 - 从数据库中提取,与传递的URL参数进行比较。或者,您可以将模式列入白名单(假设您已允许可以传递的域名,但其余网址会更改...您可以将域列入白名单和/或使用正则表达式来确定有效性。)

至少,请确保使用strip_tags或内置的mysql转义序列(如果使用PHP5,参数化SQL查询可以解决这些问题)。

答案 5 :(得分:0)

使用Sanitize类会更像蛋糕。在这种情况下,Sanitize::escape()Sanitize::paranoid()似乎合适。