PHP-保护URL中传递的参数

PHP-保护URL中传递的参数,php,security,validation,cakephp,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

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

什么是保护这些输入的最好方法,这样人们就不会传入任何令人讨厌的内容


谢谢,

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


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

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


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

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

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

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

我要重复卡斯滕的评论:定义“任何令人讨厌的东西”

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

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

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


感谢回复

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


感谢您的回复

另外,如果您有一组已知的允许URL,最好将这些允许的URL列入白名单。您甚至可以通过拥有一个包含允许的URL的DB表来动态地实现这一点——从数据库中提取该表,并与传递的URL参数进行比较。或者,您可以将模式列为白名单(假设您已经允许可以传递的域,但是url的其余部分发生了更改……您可以将域列为白名单和/或使用regexp来确定有效性)


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

此外,如果您有一组已知的允许URL,最好将这些允许的URL列入白名单。您甚至可以通过拥有一个包含允许的URL的DB表来动态地实现这一点——从数据库中提取该表,并与传递的URL参数进行比较。或者,您可以将模式列为白名单(假设您已经允许可以传递的域,但是url的其余部分发生了更改……您可以将域列为白名单和/或使用regexp来确定有效性)


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

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

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

这类问题正是router类所要解决的,它能够将参数传递给动作。查看食谱中的手册页。您可以尝试以下方法:

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的链接,此处的其他注释是正确的,在AppController的beforeFilter中,根据数据库中的提供程序验证提供程序

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

这类问题正是router类所要解决的,它能够将参数传递给动作。查看食谱中的手册页。您可以尝试以下方法:

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的链接,如果使用该类,会更容易。在这种情况下,这似乎是合适的。

使用该类更合适。在这种情况下,请不要忘记使用mysql\u real\u escape\u字符串。或者在较新版本中使用PDO对象也不要忘记在较新版本中使用mysql\u real\u escape\u字符串。或者在较新版本中使用PDO对象请定义“任何令人讨厌的事情”。任何正则表达式不能得到的东西?请定义“任何讨厌的东西”。有什么正则表达式不能得到的吗?