Php 在URL中隐藏变量

Php 在URL中隐藏变量,php,url,opencart,Php,Url,Opencart,我在一个基于OpenCart的电子商务网站上工作,想知道如何隐藏URL中传递的变量。我想这样做的原因是,我们允许客户在成功交易结束时打印他们的发票,URL的结构如下:- http://www.mywebsite.com/invoice/standard&order_id=1000010 现在的问题是,如果您将订单id的最后一个值更改为任何其他值,甚至更改任何其他数字,它将显示该订单编号的发票,如果该订单id属于另一个客户,它将向该客户显示其详细信息 现在我想知道的是,有没有一种好方法可

我在一个基于OpenCart的电子商务网站上工作,想知道如何隐藏URL中传递的变量。我想这样做的原因是,我们允许客户在成功交易结束时打印他们的发票,URL的结构如下:-

http://www.mywebsite.com/invoice/standard&order_id=1000010
现在的问题是,如果您将订单id的最后一个值更改为任何其他值,甚至更改任何其他数字,它将显示该订单编号的发票,如果该订单id属于另一个客户,它将向该客户显示其详细信息

现在我想知道的是,有没有一种好方法可以加密这个url并在服务器端解密它,从而在不显示用户订单id的情况下完成请求


如果您需要更多信息,请告诉我,我会尝试将其添加到我的问题中。

我没有Opencart的经验,但它可能会检查当前用户是否已登录,并且仅当发票属于他们时才显示发票


如果情况并非如此,则应解决根本问题,仅限客户(例如,通过登录系统)访问发票,而不是创建发票。

我没有Opencart的经验,但它可能会检查当前用户是否登录,并且仅当发票属于他们时才显示发票


如果情况并非如此,则应解决根本问题,仅限客户(例如通过登录系统)访问发票,而不是创建发票。

我没有使用Opencart,但我相信URL中显示的
订单id
不是大问题。这里的主要问题是其他用户可以查看其他用户的发票。您必须对此类非公共页面执行
访问控制。只允许所有者查看自己的发票


现在要回答您的问题,为了防止您的订单id显示在URL上,您需要使用
POST
数据,目前您正在使用
GET
。您可以使用
$\u POST
访问
POST
数据。我没有使用Opencart,但我相信URL中显示的
订单id
不是大问题。这里的主要问题是其他用户可以查看其他用户的发票。您必须对此类非公共页面执行
访问控制。只允许所有者查看自己的发票


现在要回答您的问题,为了防止您的订单id显示在URL上,您需要使用
POST
数据,目前您正在使用
GET
。您可以使用
$\u POST

访问
POST
数据这不是标准功能,因此您应该与扩展的开发人员联系。如果您的店铺允许客人退房,则URL应包含某种类型的随机密钥,或订单附带的电子邮件地址,例如,以验证请求是否仅来自授权用户。如果订单是针对注册用户的,则分配给订单的
客户id
应针对当前登录用户进行验证,如果用户未登录,则重定向到登录。这不是标准功能,因此,您应联系扩展的开发人员。如果您的店铺允许客人退房,则URL应包含某种类型的随机密钥,或订单附带的电子邮件地址,例如,以验证请求是否仅来自授权用户。如果订单是针对注册用户的,则分配给订单的
客户id
应针对当前登录的用户进行验证,如果用户未登录,则重定向到登录您实际上不需要这样做,而应该在模型/DB文件中验证该发票的登录用户

例如

我假设您的DB查询与此类似:

    $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "`");
您还应检查客户id:

    $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "` AND customer_id = '" . (int)$this->customer->getId() . "'");

如果发票不属于该客户,则不会找到任何结果。

您实际上不需要这样做,而是应该在模型/DB文件中验证该发票的登录用户

例如

我假设您的DB查询与此类似:

    $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "`");
您还应检查客户id:

    $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = `" . (int)$order_id . "` AND customer_id = '" . (int)$this->customer->getId() . "'");

如果发票不属于该客户,则不会找到任何结果。

出于某种原因,您不能使用
POST
数据?此外,如果订单是安全信息,您应该只允许以任何方式向适当的授权用户显示,因为这将是一个安全风险。有一种叫做
POST
方法和
HIDDEN
变量发送。为什么不在会话中保留变量?听起来这个问题的正确解决方案是防止客户看到非他们的发票。出于某种原因,您不能使用
POST
数据?此外,如果订单是安全信息,您应该只允许以任何方式向适当的授权用户显示,因为这将是一个安全风险。有一种叫做
POST
方法和
隐藏的
变量发送。为什么不在会话中保留变量?听起来这个问题的正确解决方案是防止客户看到不是他们的发票。只使用
POST
而不是
GET
真的不是一个解决方案-我可以使用任何最简单的工具,通过自动递增的
顺序id
向您的站点执行数千篇
帖子,然后您会非常惊讶我能获得多少信息…您是对的。我没有说解决方案是
POST
而不是
GET
。我分两部分讨论了这个问题,一部分是安全方面,我建议
访问控制
。在第二部分中,我确实提到了回答你的问题,在那里我清楚地说明了防止该命令的方法