PHP仅允许访问特定的引荐来源网址/页面

时间:2013-02-13 12:56:32

标签: php

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

2 个答案:

答案 0 :(得分:25)

这不安全,因为引用者数据很容易被欺骗。但是,如果它仍然符合您的需求,那么您的代码就可以了,因为$_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";
?>

答案 1 :(得分:6)

你想保护什么?

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

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