如何使用zend制作更安全的后端和URL?

时间:2014-04-17 04:46:13

标签: php security magento zend-framework

我正在尝试使用Zend制作后端,我想知道是否有任何方法可以使其更安全,使用任何特殊框架?我读过我可以使用:Is there something like Acegi for PHP?

这有多安全?我之前使用过spring security,它总是运行得很好,有什么类似于zend的工作吗?那些选择好吗?

我还检查了magento,例如,网址就像这样

index/key/8555b140ead18e6c004037e5c82d6478/

如果我想进入catalogo,那就是url,依此类推,他们只更改密钥而不是更改控制器名称的url,该密钥是出于安全原因的路由?或者是由框架动态创建的? (据我所知,他们使用Zend)。

感谢。

1 个答案:

答案 0 :(得分:2)

根据您正在访问的路由以及每次重新启动会话时更改的随机字符串生成该密钥 因此,对于每次登录,您都会获得不同的会话密钥 这种方法的缺点是你不能给别人一个管理员网址并告诉他“嘿!看这里”,因为他们的会话密钥是不同的。

如果您想查看此功能的实现方式,请查看Mage_Adminhtml_Model_Url::getUrl()中的以下代码:

$_route = $this->getRouteName() ? $this->getRouteName() : '*';
$_controller = $this->getControllerName() ? $this->getControllerName() : $this->getDefaultControllerName();
$_action = $this->getActionName() ? $this->getActionName() : $this->getDefaultActionName();

if ($cacheSecretKey) {
    $secret = array(self::SECRET_KEY_PARAM_NAME => "\${$_controller}/{$_action}\$");
}
else {
   $secret = array(self::SECRET_KEY_PARAM_NAME => $this->getSecretKey($_controller, $_action));
}

这是生成密钥的代码。深入了解getSecretKey方法,您会看到:

public function getSecretKey($controller = null, $action = null)
{
    $salt = Mage::getSingleton('core/session')->getFormKey();

    $p = explode('/', trim($this->getRequest()->getOriginalPathInfo(), '/'));
    if (!$controller) {
        $controller = !empty($p[1]) ? $p[1] : $this->getRequest()->getControllerName();
    }
    if (!$action) {
        $action = !empty($p[2]) ? $p[2] : $this->getRequest()->getActionName();
    }

    $secret = $controller . $action . $salt;
    return Mage::helper('core')->getHash($secret);
}

因此,密钥是来自控制器名称的哈希构建,操作名称和$salt以这种方式生成Mage::getSingleton('core/session')->getFormKey();

getFormKey方法如下所示(每个会话一个值):

public function getFormKey()
{
    if (!$this->getData('_form_key')) {
        $this->setData('_form_key', Mage::helper('core')->getRandomString(16));
    }
    return $this->getData('_form_key');
}