PHP检查以确保请求是来自我的网站的xmlhttp或来自某个域的正常请求

时间:2011-03-09 20:59:10

标签: php logic

如何编写条件以确保页面是由我的网站或允许的外部域的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");
        }
    }
?>

4 个答案:

答案 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来处理敏感数据。唯一合理安全的预防措施是使用登录。