【问题标题】:PHP Allow access to specific referrer url/page onlyPHP 只允许访问特定的引荐来源网址/页面
【发布时间】:2013-02-13 12:56:31
【问题描述】:

所以我的问题很简单,我使用以下方法允许通过引用者的域名访问 php 脚本,但我想只允许匹配完整 url 的引用者访问。

<?php
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != 'domain.com')
{
echo "Eexcuting code here";
} else {
echo('Hot Linking Not Permitted');
// display some message / image / video
exit;
}
?>

因此,如果引荐来源网址与 http://www.domain.com/page.html 匹配,则允许访问,否则如果阻止它。

【问题讨论】:

  • 这不安全。如果我愿意,我可以轻松访问您的页面。
  • 好的。那你需要我们做什么?
  • 这些全局变量由浏览器发送。每个人都可以修改它们。
  • 是的,我没有将其用作安全措施,而是用于阻止盗链,除非网址与您必须来自的网页特别匹配才能查看它。

标签: php


【解决方案1】:

这将是不安全的,因为引荐来源数据很容易被欺骗。但是,如果它仍然满足您的需求,那么您应该已经可以使用您的代码了,因为$_SERVER['HTTP_REFERER'] 包含完整的引荐来源网址,而不仅仅是域。实际上,您现在的代码需要一些调整,因为它不能那样工作:

<?php
// This is to check if the request is coming from a specific domain
$ref = $_SERVER['HTTP_REFERER'];
$refData = parse_url($ref);

if($refData['host'] !== 'domain.com') {
  // Output string and stop execution
  die("Hotlinking not permitted");
}

echo "Executing code here";
?>

请注意,如果您在检查它是否是您想要的之前检查是否设置了 HTTP_REFERER,那么人们会在根本没有设置任何引荐来源网址的情况下访问您的脚本,因此您无论如何都应该检查它。现在,检查特定的 URL 就简单多了:

<?php
// This is to check if the request is coming from a specific URL
$ref = $_SERVER['HTTP_REFERER'];

if($ref !== 'http://domain.com/page.html') {
  die("Hotlinking not permitted");
}

echo "Executing code here";
?>

【讨论】:

  • 非常感谢 gargon 正是我所追求的。非常感谢。
  • 这也可以作为 url 末尾的查询字符串的匹配项吗? "page.html?123"
  • 是的,它也会匹配那些。
  • $_SERVER['HTTP_REFERER']; 很容易被伪造。
【解决方案2】:

你想保护什么?

您永远不应该相信 HTTP_REFERER,因为它可能会被欺骗(正如其他人所指出的那样)。还有一些防火墙和安全软件会重写或删除referer,并不是所有的浏览器都能正确报告。

如果是敏感数据,那么我个人会在页面之间传递哈希。

【讨论】:

猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多