【问题标题】:Verify the HTTP_REFERER if is set then pass the information验证 HTTP_REFERER 是否已设置,然后传递信息
【发布时间】:2016-04-18 12:22:30
【问题描述】:

我有一个表格,我需要验证 $_SERVER['HTTP_REFERER'] 是否已补充,如果是,则在提交到数据库后通过 HTTP_REFERER。问题是,当您提交表单时,$_SERVER['HTTP_REFERER'] = 表单托管位置,我需要用户访问表单的HTTP_REFERER。 我试过这个:

if(!isset($_SESSION['REFERER'])){
    $_SESSION['REFERER'] = $_SERVER['HTTP_REFERER'];
}

$_SESSION['REFERER'] 将是表单的托管位置。

【问题讨论】:

  • verifyHTTP Referrer 无法相处。如果您在浏览器中使用隐私模式,则可能会删除推荐人。您将有合法的请求而无需推荐人。
  • 您是否在设置会话的页面顶部写了 session_start() ?如果不是会话将无法工作。
  • 我有session_start()

标签: php session session-variables http-referer


【解决方案1】:

您可以在表单上按照以下方式进行操作:

<input type="hidden" name="referrer" value="<?= htmlspecialchars($_SERVER['HTTP_REFERER']) ?>">

通过这种方式,用户可以将此数据发布给您。我想您打算这样做是为了让用户在登录后返回他们正在访问的页面,请记住两件事:

  • 恶意用户可以自己修改引荐来源网址,因此您需要小心用户发送的内容,以免您的服务器受到攻击。
  • 恶意用户可以操纵其他人的引荐来源网址。

您需要检查您的引荐来源网址是否为 URL,并且您需要检查其来源是否在您自己的域中。

之后,您可以使用

从表单中读取数据
<?php $originalreferrer = $_POST['referrer']? $_POST['referrer'] : 'default_value';

【讨论】:

  • 我不能使用隐藏,因为它可以修改并且不用于登录。我需要使用会话来存储该信息,但是当用户访问表单时,我似乎无法存储引荐来源网址
  • 你的例子引入了XSS漏洞
  • @DanFromGermany 这就是为什么我指出它并不完美,他需要确保所有内容都经过检查和双重检查。
  • @NeculaiAndrei 如果用户操作单个字段的危险可能会损害您的应用程序,那么您应该真正考虑一种完全不同的方法来处理您的应用程序。就像隐藏的输入一样,引用者可以轻松修改。无论哪种方式,您的方法都不安全。
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多