【问题标题】:How to prevent user from bookmarking URLs?如何防止用户为 URL 添加书签?
【发布时间】:2013-07-16 11:04:18
【问题描述】:

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

<p><a href="/blank.php?name1=value1&amp;name2=value2">next page</a></p>

第二页:blank.php?name1=value1&amp;amp;name2=value2

$name1 = $_GET['name1'] ;
$name2 = $_GET['name2'] ;
echo $name1 ;
echo $name2 ;

这种方式网页是在现场创建并显示的有点像 CMS,我对我网站的所有网页都使用这种方法,但是如果用户将标签添加为书签,他们将拥有该网页的过时信息,因为该页面内容包含在 URL 中。

编辑:如果我要使用post,它们会是将该信息传达给新网页的更好方式吗?而不是:

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

【问题讨论】:

  • 你应该使用 POST 而不是 GET。
  • 那么,您是说使用参数为 URL 添加书签不起作用吗?看起来应该。
  • 您可以创建一个随机链接,该链接会在一定时间后断开。
  • 旁注:不要在没有过滤的情况下回显 GET-Vars,因为它使代码注入成为可能。见php.net/manual/de/function.htmlspecialchars.php
  • 这是一种不寻常的页面生成方式。除了违反著名的“Cool URIs don't change”规则外,它还可能允许人们制作看似是您内容的一部分的 URL,但可以随便说什么。查询字符串通常会说明要显示的 type 内容,然后 DB 或类似内容会存储实际值,对于同一查询,该值可能会随着时间而变化。

标签: php html forms url get


【解决方案1】:

快速而肮脏的解决方案:在您的网址中添加时间戳参数,例如:

<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);

因此,如果链接超过一小时(60 秒乘以 60 分钟),则会被重定向到主页!

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

【讨论】:

    【解决方案2】:

    您可以阻止用户使用键盘快捷键添加书签,但我认为没有任何方法可以阻止用户在浏览器中添加书签(或为此写下 URL)。

    您可能希望考虑在每次页面加载时在页面上生成数据,因此如果用户将 URL 加入书签,他们会看到最新信息。或者,如果用户没有按照特定路径到达该路径,则会显示一条消息,告诉他们数据已过期。

    【讨论】:

      【解决方案3】:

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

      遗憾的是,无法阻止人们为您的页面创建书签,您只需过滤掉可以查看(编辑或访问)它的人。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-10-21
          • 2020-03-31
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 2010-10-10
          • 2011-08-27
          • 2010-12-30
          • 2011-06-28
          相关资源
          最近更新 更多