【问题标题】:PHP - securing parameters passed in the URLPHP - 保护 URL 中传递的参数
【发布时间】:2009-01-07 09:38:50
【问题描述】:

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

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

谢谢,

【问题讨论】:

  • 请定义“任何讨厌的东西”。正则表达式不会得到什么?

标签: php security validation cakephp


【解决方案1】:

这里的其他 cmets 是正确的,在 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 的链接

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        感谢回复

        【讨论】:

        • 别忘了也做一个mysql_real_escape_string。
        • 或者对新版本使用 PDO 对象
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-31
            • 1970-01-01
            • 2016-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多