1

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

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

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

4

3 回答 3

6

你做错了。而不是试图掩盖id你只需要确保(检查后端)id属于用户。

如果 id 不属于该用户,则返回状态代码之一403 Forbidden或简单404 Not Found

于 2012-04-04T22:57:49.017 回答
0

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

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

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

于 2012-04-05T18:05:11.320 回答
0

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

编辑

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

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

然后根据当前登录的用户检查返回的用户名。

如果我侮辱了你的智商,我很抱歉,但我不确定你到底在追求什么!

于 2012-04-04T23:58:02.763 回答