我正在开发基于OpenCart的电子商务网站,想知道如何隐藏URL中传递的变量。我想这样做的原因是我们允许客户在成功交易结束时打印发票,URL的结构如下: -
http://www.mywebsite.com/invoice/standard&order_id=1000010
现在问题是,如果您将 order_id 的最后一个值更改为其他任何内容,甚至更改任何其他数字,它将显示该订单号的发票,如果是< strong> order_id 属于另一位客户,它会向该客户显示其详细信息。
所以现在我想知道的是有一种很好的方法来加密这个网址并在服务器端解密它以完成请求而不向用户显示 order_id 。
如果您需要更多信息,请告诉我,我会尝试将其添加到我的问题中。
答案 0 :(得分:4)
我没有使用Opencart的经验,但可能会检查当前用户是否已登录,并仅在发票属于他们时显示发票。
如果不是这种情况,则应修复基本问题,并且仅限于客户(例如通过登录系统)访问发票,而不是创建security through obscurity。
答案 1 :(得分:2)
我没有使用过Opencart,但我相信网址中显示的order_id
不是大问题。这里的主要问题是其他用户可以查看其他用户的发票。您必须为这些非公开页面执行access control
。只允许所有者查看自己的发票。
现在回答您的问题,为了防止您的order_id显示在网址上,您需要使用POST
数据,目前您正在使用GET
。您可以使用POST
访问$_POST
数据。
答案 2 :(得分:2)
您不应该真的这样做,而应该在模型/数据库文件中验证该发票的登录用户。
例如......
我认为,您的数据库查询与此类似:
$this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "`");
您还应该检查customer_id:
$this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "` AND customer_id = '" . (int)$this->customer->getId() . "'");
如果发票不属于该客户,则不会找到任何结果。
答案 3 :(得分:1)
这不是标准功能,因此您应该联系该扩展程序的开发人员。如果您的商店允许访客结账,则URL应包含某种随机密钥或附加到订单的电子邮件地址,以便验证该请求仅来自授权用户。如果订单是针对注册用户,那么分配给订单的customer_id
应该针对当前登录用户进行验证,如果用户未登录则重定向到登录