2014-03-12 31 views
0

在我ZF2应用程序,我想我的加密参数,使得具有像/产品/更新/ 1将显示为/产品/更新/ cdsk45kdi340kd0wlw0或类似链接时。我需要在控制器和视图中对它进行加密和解密。什么是最好的方法呢?感谢您的任何帮助。ZF2加密参数

+0

你能解释一下使用“加密”这样做的原因是什么?为什么uuid,slug或hash不够? –

+0

我只是想避免这种情况,用户可打电话与猜测ID的一个网址...哈希将是一个很好的选择,你可以给我一个例子吗? – cwhisperer

回答

1

这里的关键是,你想避免用户猜测的URL。我会为每个产品生成一个随机标记。在您的数据库中存储此令牌以及产品的标识(以及所有其他属性)。

要生成一个随机字符串作为标记,可以使用Zend\Math\RandRand::getString(10);为您提供一个随机的10个字符的字符串。将产品存储在数据库中时,为每个产品生成一个随机字符串。然后,在您的控制器中,您不会根据标识符(id)获取产品,而是基于该标识。

+1

确保您验证的唯一性。你也可以使用uniqid()而不是随机函数。 – dualmon

+0

当然,好点。至少在你的数据库上设置一个唯一的约束,并检查该令牌是否已经存在。 –

+1

而不是随机生成,你可以一个base64或MD5 id和名字联系在一起,它会为你节省存储在DB什么(另一个数据库调用来检索)。这就是通常处理外部唯一URL的方式。如果它需要每个用户都是唯一的,则可以将用户电子邮件和/或ID包含在您加密/编码的字符串中。 –

1

化妆路线是这样的

'product' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment', 
    'options' => array(
    'route' => '/product/update[/:hashedid]', 
    'constraints' => array(
     'hashedid' => '[a-zA-Z0-9-_\.]+', 
    ), 
    'defaults' => array(
     'controller' => 'Index', 
     'action'  => 'index', 
    ), 
    ), 
), 

和控制器

$hashedid = $this->params()->fromRoute('hashedid', 0); 
$id = $this->dehash($hashedid); 
+0

感谢您的回复......但我用什么来散列id?我宁愿用盐腌哈希...... – cwhisperer

+0

@cwhisperer你可以使用任何你想要的盐听起来不错这里http://stackoverflow.com/a/1289114/3223896 – Skaza

+0

谢谢你的链接。不幸的是,BASE64_ENCODE生成加密的字符串,这让我的路线斜杠(/),检查agains约束,无效.... – cwhisperer