0

我在http://www.example.com/abc/def/a/下有一个页面,用户可以在其中购买产品。对于营销活动(印刷纸),客户应输入较短的网址 http://www.example.com/order/

当调用这个 url 时,服务器会执行这个脚本:

<?php
header("Location: http://www.example.de/abc/def/a/");
exit;
?> 

http://www.example.com/abc/def/a/下的页面包含一些信息(回扣代码等),这些信息应该只对来自http://www.example.com/order/的用户可见

$_SERVER['HTTP_REFERER']从我读到的内容似乎不可靠。

我检查了phpinfo();是否有任何包含“订单”的信息变量,但我没有找到。

有可能还是您推荐另一种方法?

4

2 回答 2

1

HTTP 是纯粹的stateless-protocol形式,因此您不会在协议本身中找到任何可以帮助您解决当前问题的内容。

使用$_SESSION在请求之间存储数据是最容易走的路线,也是我推荐的。

如前所述;由于用于传输信息的协议是无状态的,因此您别无选择,只能为您的 Web 应用程序创建一种方法来识别哪个用户完成了哪个请求。这是 php-sessions 解决的完美问题。


于 2012-07-14T07:47:19.280 回答
1

正如您所发现的,HTTP Referer 以及所有其他标头很容易被伪造。我看到的唯一可靠的方法是在用户访问订单页面时记录用户,当他们访问该/abc/def/a/页面时,验证日志条目是否存在。这种日志可以存储在 中$_SESSION,但是请确保在使用多个服务器时进行正确的设置,以确保所有服务器共享相同的会话信息(您可以使用redis 服务器来存储会话数据)。

在订单页面:

session_start();
$_SESSION['order_visited'] = true;

在回扣代码页上:

session_start();
if(!isset($_SESSION['order_visited']) || !$_SESSION['order_visited']) {
    header('Location: /order'); // Must visit order first
    die();
}
于 2012-07-14T07:51:55.520 回答