11

所以我的问题很简单,我使用以下方法允许通过引用者的域名访问 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匹配,则允许访问,否则如果阻止它。

4

2 回答 2

27

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

<?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";
?>
于 2013-02-13T13:08:42.547 回答
6

你想要保护的是什么?

你不应该相信 HTTP_REFERER 因为它可以被欺骗(正如其他人指出的那样)。此外,一些防火墙和安全软件会重写或删除引用者,并非所有浏览器都能正确报告。

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

于 2013-02-13T13:20:18.767 回答