首页 文章

Yii的 . 重定向前检查URL以防止攻击

提问于
浏览
0

我有来自 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 更改为外部网站网址 . 例如:如果我把 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;
    }
 }

但可能存在更合适的方式

1 回答

  • 0

    正确的方法是解析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;
    }
    

相关问题