0

我有一个应用程序根据部分 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 的元素来决定在我的应用程序的其余部分中使用哪些数据。我的问题是...

什么是保护这个输入的最好方法,这样人们就不能传入任何讨厌的东西?

谢谢,

4

6 回答 6

1

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

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

于 2009-01-07T10:00:52.567 回答
1

我会重申卡斯滕的评论:定义“任何讨厌的东西”

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

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

于 2009-01-07T13:46:24.157 回答
1

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

感谢您的回复

于 2009-01-07T16:52:17.353 回答
1

这里的其他评论是正确的,在 AppController 的 beforeFilter 中针对您的数据库中的提供者验证提供者。

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

这类问题正是路由器类所要解决的问题,它能够将参数传递给动作。查看说明书http://book.cakephp.org/view/46/Routes-Configuration中的手册页。您可以尝试以下方法:

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

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

通过设置捕获这部分 URL 的路由,它会立即在 $this->params['provider'] 中可用,但比这更好的是 html 帮助器 link() 方法自动构建正确格式的 URL,例如

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

这会返回一个类似 /zzz/xxx/yyy 的链接

于 2009-01-07T20:33:40.357 回答
0

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

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

于 2009-01-07T17:30:17.793 回答
0

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

于 2009-03-23T17:06:22.340 回答