我有来自 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);
但它也工作,然后我将 $returnUrl 从 controller/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 回答
正确的方法是解析returnUrl并删除方案(
http://
或https://
)和其他不安全的东西 .