我正在开发一个网站,由于用户输入或其他原因,我需要显示一些错误消息.为此,我有一个名为error.php的页面,我使用$ _GET获取错误号.所有错误消息都存储在一个数组中.
例:
header( 'Location: error.php?n=11' );
但我不希望用户在URL中输入错误代码并查看所有其他错误消息.为了防止这种情况,我想我可以将引用页面列入白名单,并且只有在我的白名单中找到引用者时才显示错误消息.
它应该是公平的(尚未测试;))
$accept = false; $allowedReferer = array (0=>'page1.php', 'page2.php'); if (in_array($_SERVER['HTTP_REFERER'], $allowedReferer )) {$accept = true;} if ($accept) { $n=$_GET['n'];echo "Error: " . $errorList[$n];}
这种方法是否足以避免间谍用户?
我正在用PHP5做这个
谢谢
不,它不是远程安全的:HTTP
Referer
标头对于欺骗是微不足道的,也不是必需的标头.我建议你阅读这篇文章,了解一个利用代码(用PHP编写)的例子,或者下载这个用于Firefox的附加组件,以便在您自己的浏览器中自行完成.
此外,您的$allowedReferer
数组应该包含完整的 URL,而不仅仅是脚本名称,否则代码也可以从远程引用中利用,例如来自
http://www.example.org/page1.php
总结一下:您无法在不需要身份验证的情况下限制对任何公共网络资源的访问.
您可以简单地显示"就地"错误,而不是重定向 - 例如,像使用类似的东西调整您的当前代码一样简单
if ($error_condition) { $_GET['n']=11; include "/path/to/error.php"; exit; }
在实践中,它可能会更复杂,但想法是相同的 - 用户会看到错误消息而不重定向.确保输出某种错误标题,例如标题("HTTP/1.0 401 Bad Request")告诉浏览器它没有真正看到所请求的页面.
如果您确实想要重定向,那么您可以通过包含错误编号的哈希来创建"防篡改"URL,并使用只有您的代码知道的盐,例如
$n=11; $secret="foobar"; $hash=md5($n.$secret); $url="http://{$_SERVER['HTTP_HOST']}/error.php?n={$n}&hash={$hash}";
现在你的error.php可以检查是否正确创建了提供的哈希.如果是,则很可能它是由您的代码创建的,而不是用户创建的.