我在网站上生成了一个简单的整数网址,允许用户查看过去的订单。
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 :(得分:6)
你做错了。您不必试图模糊id
,而是必须确保(检查后端)id
属于用户。
如果该ID不属于该用户,则返回状态代码403 Forbidden
或404 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将为空。
这不是一个完美的解决方案,但它肯定会阻止人们浏览他们不应该的订单。