【问题标题】:Yii. Checking url before redirecting to prevent attack易。在重定向之前检查 url 以防止攻击
【发布时间】:2014-03-20 17:13:08
【问题描述】:

我有来自 Form$returnUrl var,其中包含控制器/操作:

<?=CHtml::hiddenField('returnUrl', 
    Yii::app()->urlManager->parseUrl(Yii::app()->request)
);?>

在控制器中我有这样的东西:

$returnUrl = Yii::app()->request->getPost('returnUrl');
$returnUrl = array($returnUrl);
$this->redirect($returnUrl);

但它也可以工作,然后我将 $returnUrlcontroller/action 更改为外部网站 url。例如:如果我把 http://google.com 放到 $_POST['returnUrl'] 而不是 site/index yii 将我重定向到 / http://google.com 没有任何错误。

在重定向之前检查 $returnUrl 的最佳方法是什么?如何将 $returnUrl 与我的路由或控制器/操作进行比较?

现在我做下一步:

$returnUrl = Utils::sanitizeReturnUrl($returnUrl);    
...
class Utils 
{
    public static function sanitizeReturnUrl($returnUrl)
    {
        if (!preg_match('~^([-a-z0-9_]+|[-a-z0-9_]+/[-a-z0-9_]+)+$~i', $returnUrl))
        {
            $returnUrl = Yii::app()->homeUrl;
        }

        return $returnUrl;
    }
 }

但可能存在更合适的方式

【问题讨论】:

    标签: url redirect yii sanitize


    【解决方案1】:

    正确的方法是解析你的 returnUrl 并删除方案(http://https://)和其他不安全的东西。

    <?php
    $returnUrl = 'http://username:password@hostname/path?arg=value#anchor';
    $returnUrl = sanitizeReturnUrl($returnUrl);
    echo $returnUrl; 
    /**
     * now you got:
     * hostname/path?arg=value#anchor
     */
    
    function sanitizeReturnUrl ($url)
    {
        $urlArray = parse_url($url);
        $url = $urlArray['host'] . $urlArray['path'] . '?' . $urlArray['query'] . '#' .     $urlArray['fragment'];
        return $url;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2016-08-25
      • 1970-01-01
      • 2019-12-11
      • 2010-11-27
      • 2016-10-06
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多