如何模糊网址的参数

时间:2012-04-04 22:56:11

标签: php magento

我在网站上生成了一个简单的整数网址,允许用户查看过去的订单。

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();
    }

但这不起作用。什么是在网址中隐藏此参数的好方法?

3 个答案:

答案 0 :(得分:6)

你做错了。您不必试图模糊id,而是必须确保(检查后端)id属于用户。

如果该ID不属于该用户,则返回状态代码403 Forbidden404 Not Found

答案 1 :(得分:0)

当然,如果关于人和订单,你将有一个用户表或数据存储区,当解析随机网址时,检查该订单号是否属于当前登录用户,如果是,则允许数据,如果不是,返回'未经授权,请登录'

修改

我不确定你的系统是什么,但运行纯粹的假设,这可能是有用的......

我假设用户下了订单。所以我也假设有一个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

这样的东西

然后针对当前登录的用户检查返回的用户名。

如果我侮辱你的情报,我很抱歉,但我不确定你到底想要什么!

答案 2 :(得分:0)

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

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

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