我有一个简单的跟踪像素,用于验证用户帐户:
<?php
header('Content-Type: image/gif');
readfile('trackingpixel.gif');
if(isset($_GET['a'])){
... stuff
}
if(isset($_GET['b'])){
... stuff
}
if(isset($_GET['c'])){
... stuff
}
$requesting = $_SERVER['HTTP_REFERER'];
... If requesting matches value stored in db, and a/b/c are all good, do stuff
?>
可通过以下方式访问:
<img src="http://thisismydomain.com/trackingpixel.php?a=...&b=...&c=..." />
它通常按预期工作。
这个想法是一些用户拥有自己的域,并希望“声明”它们,并验证他们是真正的所有者。我们还有其他验证选项(即 META 标签),但这是最简单的,对于最基本的用户 - 只需复制并粘贴透明图像,Bob 就是你的阿姨。
包含请求域的唯一$_SERVER
变量是HTTP_REFERER
,但即使是最简单的 Google 搜索也会返回大量讨论该值的不可靠性和易欺骗性的文章。
'HTTP_REFERER'
将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。
并且有无数的 SO 帖子讨论相同的问题。
就目前而言,一个半胜任的计算机猴子可能会欺骗他们不正确的域以显示为正确的域,然后将其<img>
放在他们的页面上。我的 PHP 脚本会认为一切都是 honkey-dory,并通过所有条件。
没有布埃诺!呸!
是否有替代方法HTTP_REFERER
,我可以使用它来验证请求域?什么是安全的,最好是必需的?