Php 如何防止用户为URL添加书签?

Php 如何防止用户为URL添加书签?,php,html,forms,url,get,Php,Html,Forms,Url,Get,我的网站的网页通过使用GET从预定义的URL检索变量来显示网页。 例如,第一页上的代码:index.php <p><a href="/blank.php?name1=value1&amp;name2=value2">next page</a></p> 这种方式可以在现场创建网页,并像CMS和Iuse一样显示。我的网站上的所有网页都使用这种方法,但是如果用户将某个标签添加到书签中,则该网页的信息将过期,因为该网页内容包含在URL中 编辑:如

我的网站的网页通过使用
GET
从预定义的URL检索变量来显示网页。 例如,第一页上的代码:
index.php

<p><a href="/blank.php?name1=value1&amp;name2=value2">next page</a></p>
这种方式可以在现场创建网页,并像CMS和Iuse一样显示。我的网站上的所有网页都使用这种方法,但是如果用户将某个标签添加到书签中,则该网页的信息将过期,因为该网页内容包含在URL中

编辑:如果我使用
post
将这些信息传递到新网页上,他们的方法会更好吗?而不是:

<form method="post" action="blank.php">
    <input type="hidden" name="name1" value="value1">
    <input type="submit">
</form>

您可以阻止用户使用键盘快捷键进行书签,但我认为无论如何都没有办法阻止用户在浏览器中将其作为书签(或写下URL)


您可能希望在每次页面加载时查看页面上生成的数据,以便如果用户将URL添加到书签中,他们可以看到最新的信息。或者,如果用户没有按照某个路径到达该路径,则会显示一条消息,告诉他们数据已过期。

使用POST而不是GET将在很大程度上解决问题,但我知道这可能不可能,具体取决于您已创建的代码量。另一种可能的解决方案是设置会话变量,以确定此人是否应该访问此页面。如果他们没有访问权限,您会将他们发送回登录页、个人资料甚至登录页。我通过在一个页面上放置只能设置的会话变量来实现这一点,然后在查看页面后将其销毁,这样它们就不能简单地返回页面,因为会话值已消失


遗憾的是,不可能阻止人们为你的页面创建书签,你只需要过滤掉那些可以看到(编辑或访问)它的人

快速而肮脏的解决方案:向URL添加时间戳参数,如:

<p><a href="/blank.php?name1=value1&amp;name2=value2&amp;time=<?php echo time(); ?>">next page</a></p>
因此,如果一个链接超过一小时(60秒乘以60分钟),它将被重定向到主页


但是这种方法对用户不是很友好!你最好尝试建立你的链接,这样他们在访问时就不会得到旧的内容

您本质上只讨论所有变量都有意义的用户会话。即使使用POST也不能解决问题。在极端情况下,用户可能会发出POST请求(或搜索引擎可能会这样做),并误解检索到的结果。我建议像许多其他网站一样在后端添加sessionid,以控制有效的时间范围。这样,您可以更好地控制网站功能和用户体验。会话是否已过期取决于您的业务逻辑,而不是GET/POST方法。

您可能应该使用POST而不是GET。那么,您是说用参数为URL添加书签不起作用吗?看起来应该是这样的。你可以创建一个随机链接,在一定时间后断开。旁注:永远不要在没有过滤的情况下回显GET VAR,因为这会使代码注入成为可能。这是一种不寻常的生成页面的方法。除了诋毁著名的规则“”之外,它还可能允许人们创建URL,这些URL似乎是你内容的一部分,但可以随心所欲地说。查询字符串通常会指出要显示的内容类型,然后DB或类似的字符串会存储实际值,对于同一查询,实际值可能会随时间而变化。
<p><a href="/blank.php?name1=value1&amp;name2=value2&amp;time=<?php echo time(); ?>">next page</a></p>
if(!isset($_GET['time']) || time() - intval($_GET['time']) > 60*60) {
    header('Location: index.php');
}

$name1 = $_GET['name1'] ;
$name2 = $_GET['name2'] ;
echo htmlspecialchars($name1);
echo htmlspecialchars($name2);