如何编写条件以确保页面是由我的网站或允许的外部域的xmlhttp请求访问的?
<?php
$referrer = $_SERVER['HTTP_REFERER'];
if($_SERVER["HTTP_X_REQUESTED_WITH"] !== 'XMLHttpRequest') {
if(preg_match("/accepteddomain.com/",$referrer) {
header("Location: http://www.domain.com/desiredpage.php");
} else {
header("Location: http://www.domain.com/nondesiredpage.php");
}
}
?>
答案 0 :(得分:2)
考虑到客户端(浏览器或可以发送HTTP请求的任何其他内容)(或未发送)引用Referer和X-Request-With标头
,他们不可信任。您可以将它们用作提示,以增强用户体验;但你不能依赖它们存在或正确。
基本上,您无法确定请求来自特定域(即使对于XmlHttpRequest:浏览器只能在同一个域上使用XHR ...但您无法确定您收到的请求是否来自XHR)。
在可能的想法中(不确定您真正的问题/需要是什么),您可能会尝试使用某种API密钥来限制请求率等等吗?
答案 1 :(得分:1)
你正确拼写了引用者,但不幸的是编写HTTP规范的人不能!您需要使用HTTP_REFERER
。
您可能还想要转义点\.
,因此它只匹配点而不是所有内容。
答案 2 :(得分:0)
Ajax请求只能来自同一个域。由于内置的安全原因,您无法从其他站点发出XMLHttp请求。
此网站完美地概述了您无法启动跨域XMLHTTPRequest http://developer.yahoo.com/javascript/howto-proxy.html
所有现代Web浏览器都对网络连接施加了安全限制,包括对XMLHttpRequest的调用。此限制可防止脚本或应用程序连接到除最初来自网页之外的任何Web服务器(如果在首选项中启用了该选项,则Internet Explorer将允许跨域请求)。如果您的Web应用程序和应用程序使用的XML数据都直接来自同一服务器,那么您不会遇到此限制。
答案 3 :(得分:0)
您需要注意,HTTP标头很容易被欺骗,因此有人可以轻松telnet并发送该HTTP标头并访问该页面。不要依赖HTTP REFERER来处理敏感数据。唯一合理安全的预防措施是使用登录。