2012-04-04 42 views
1

我使用网站上的一个简单整数生成网址,以便用户查看过去的订单。如何模糊网址的参数

http://site.com/order_id/145323

的问题是,这是很容易的,只是改变号码,然后查看其他人的订单。我想知道什么是一个简单的方法来编码这个数字在URL中,然后让PHP解码它,所以它可以运行控制器?它不必是超级安全的,它可以让人们不那么容易地改变数字来查看数据。我试图做类似:

order_id/<?php echo base64_encode($theOrder); ?>

,然后在控制器动作我想:

if($orderId = (int) $this->getRequest()->getParam('order_id') && Mage::getSingleton('customer/session')->isLoggedIn()){   
     $orderId = (int) $this->getRequest()->getParam('order_id'); 
     $orderId = base64_decode($orderId); 
     $order = Mage::getModel('sales/order')->load($orderId); 
     Mage::register('current_order', $order); 
     $this->loadLayout(); 
     $this->renderLayout(); 
    } 

但这并不工作。什么将是一个很好的方式来隐藏该网址中的这个参数?

+0

同意PeeHaa,并且还想补充一点,base64并没有太多的模糊。大多数半技术的人可以识别base64字符串(在2/3的情况下末尾的'='填充是通常的放弃)。 – 2012-04-04 23:00:39

+0

我明白这不是一个很好的解决方案,容易破解,但比现在有更好的解决方案。我会做PeeHaas的解决方案,如果我知道如何,但我没有任何想法在哪里开始运行这样的检查,我需要得到一个临时修复迅速。 – Zac 2012-04-04 23:03:50

+0

除了是高级错误之外,您的方法似乎会完成您想要的任务。为什么它不起作用? – 2012-04-05 01:17:39

回答

6

你做错了。您不必试图掩盖id,您只需确保(在后端检查)id属于用户。

并且如果该ID不属于该用户,则返回状态码403 Forbidden或简单地404 Not Found

+0

是的,这会更好,但我正在寻找一个创可贴修复,直到我升级网站。我不知道如何检查ID是否属于客户。 – Zac 2012-04-04 23:01:28

+1

恕我直言,你的创可贴解决方案不是解决方案,而是一个问题。您已经在跟踪哪些订单属于哪些订单“我使用网站上的简单整数生成网址,以便用户查看过去的订单”。所以一个简单的查询匹配两个将解决它。 – PeeHaa 2012-04-04 23:04:12

0

当然,如果它关于人员和订单,您将拥有一个用户表或数据存储,当解析随机url时,检查该订单号是否属于当前登录的用户,如果是,则允许数据,if不,返回“未经授权,请登录”

编辑

我不知道你是什么系统需要,但纯粹的假设上运行,这可能是有用的...

我假设用户下订单。所以我还假设有一个ORDERS表,所有的订单都被存储和提取。

Orders表,你应该存储作出命令的用户,说

USERS table 
---------- 
user_id, username, password, full name, dob, etc 

ORDERS table 
---------- 
order_id, order_type, quantity, date_ordered, user_id 

因此你可以使用一个SQL查询来获取与订单相关联的用户。

喜欢的东西SELECT username FROM users JOIN orders ON users.user_id = orders.uder_id

然后检查返回的用户名与在当前登录的用户。

对不起,如果我侮辱你的智力,但我不确定你到底是什么!

+0

当然,我想出了如何使我的哈希编码工作,但我想追求更好的方式来做到这一点,因为你们都建议。我可以阅读的任何链接或例子将不胜感激。 – Zac 2012-04-05 00:13:39

0

正如其他人所说的,解决此问题的最佳方法是修改访问数据的方式,并检查请求中的订单号是否与试图访问该订单的用户相关联。

但是,如果您需要一个非常快速的修复,您可以检查是否设置了请求的HTTP_REFERER。如果已设置,并且它指向您网站上的某个网页,则可以合理确定这是一个合法请求。如果用户通过修改订单号修改了URL,则HTTP_REFERER将为空。

这不是一个完美的解决方案,但它肯定会阻止人们浏览他们不应该的订单。