如果访问者不是来自某个页面(在同一个域上),则阻止对PHP页面的访问

如果访问者不是来自某个页面(在同一个域上),则阻止对PHP页面的访问,php,nginx,http-referer,Php,Nginx,Http Referer,正如标题所说,如果访问者不是来自特定的URL,我想阻止他们查看页面内容。我怎样才能做到这一点?我在Nginx上有PHP。使用PHP还是Nginx更好 我读到使用HTTP_REFERER并不是最好的主意,因为它不是浏览器必须使用的。。。通过代码示例,您会做些什么?限制访问页面的唯一方法是使用某人的凭据,没有可靠的方法来检测用户来自何处,因为这可能是伪造的 因此,只有当用户来自页面a时才允许访问页面B,除非您通过HTTP\U REFERER不可靠地进行访问 您还可以在页面a上设置cookie或会话变

正如标题所说,如果访问者不是来自特定的URL,我想阻止他们查看页面内容。我怎样才能做到这一点?我在Nginx上有PHP。使用PHP还是Nginx更好


我读到使用HTTP_REFERER并不是最好的主意,因为它不是浏览器必须使用的。。。通过代码示例,您会做些什么?

限制访问页面的唯一方法是使用某人的凭据,没有可靠的方法来检测用户来自何处,因为这可能是伪造的

因此,只有当用户来自页面a时才允许访问页面B,除非您通过HTTP\U REFERER不可靠地进行访问


您还可以在页面a上设置cookie或会话变量,而不显示页面B,除非用户设置了cookie会话变量,但这并不要求用户直接从页面a转到页面B

可能不完美,但我会在初始页面上设置$\u会话,然后在链接页面上检查并删除它

$_SESSION['allow'] = 'yes';
然后在下一页

if(isset($_SESSION['allow']) && $_SESSION['allow'] == 'yes') {
    $_SESSION['allow'] = 'now viewing';
}

或者类似的东西……

您可以使用会话变量,从一个页面传递特定的“键”,并在下一个页面上要求它来显示它


您可以找到会话的信息

最可靠的解决方案是传递一个从一页到下一页都不容易猜到的参数,即a-la唯一令牌

然而,它需要花费大量的努力才能正确实现,因为它不是最简单的解决方案,也不是最简单的实现方法

按照复杂性的顺序,最简单的在顶部,您的备选方案是:

推荐人 使用固定的GET参数 Cookie放在用户的第一页上。不适用于不接受cookie的访客,如果您在欧盟工作,您需要cookie政策。 使用nonce作为GET参数 最后一个详细的解决方案


初始页面生成一个一次性字符串,并将其附加到每个链接。然后检查此字符串是否与数据库/平面文件中的条目匹配,如果匹配,则允许访问。否则,您将拒绝访问。然后,您将使令牌无效,以便用户必须再次浏览该页。

一种简单的方法是在第一页上设置一次性会话变量,然后在第二页上读取该变量

例如,第1页:

$_SESSION['viewed_page1'] = true;
第2页:

if(!$_SESSION['viewed_page1']){
  echo 'You need to visit page 1 first!';
}

.

这几乎是不可能的。依赖HTTP_referer将是实现这一点的唯一方法,正如您所说,这并不能保证。这比它不是强制性的更糟糕,但它可能被欺骗!功能需要重新考虑。为什么您只希望来自特定URL的人看到它?有人能不能把一个链接交给包含受保护页面链接的页面?这里有一个源代码可以做到这一点:如果你觉得现有的QA材料不合适,那么还是链接它,并明确告诉你哪些不适合你。做一个好的调查,这样你就可以链接好的网站资源,也就更清楚你的实际问题是什么。例如,您正在使用HTTP请求状态,第一个答案应该是cookie,而不是查询信息部分$\u GET。如果您正在执行一次性会话密钥,则使用GET/POST参数可能是更好的选择,对于其他答案中提到的cookie问题,如欧盟cookie策略、拒绝cookie的人等。GET/POST可以由客户端设置。我想这取决于OP需要的验证量。如果用户来自您开发的页面,您可以传递一个会话变量。@NappingRabbit这就是我对cookie的评论中提到的,会话变量是通过cookies实现的。如果您依赖默认的PHP会话系统,那么会话变量和cookie在实现上是类似的,因为sessionID就是这样延续的。此外,许多解决方案都未能解决的一个问题是,这两个页面可能位于不同的域上,这一点上cookies不一定是前进的方向。如果哈希实现不是微不足道的,那么就不容易伪造。如果会话本身存在设计缺陷,那么会话也很弱。uGET的优点是它对访问者的设置不做任何假设。如果用户知道要欺骗什么,访问者只需单击链接即可通过$\u GET is spoofable。这样做的目的是使其安全,这样用户就无法知道一个有效的令牌进行欺骗,除非他们访问网关页面。通过模糊的安全性不是安全性。再次…获取参数!我会给你写一个简单的例子。这就是我要做的。适当地假设你控制了引用页面。这似乎是我的解决方案。我试图使用它,所以我创建了两个文件:page1.php和page2.php。page1.php:page2.php问题是,如果我从page1.php链接访问page2.php并直接访问它,我会看到第2页 y,浏览器处于匿名状态,因此未设置cookie。。APC可能是问题所在吗?还是我做错了什么您需要添加session\u start;在这两页的顶部。