【问题标题】:PHP check to make sure request is either xmlhttp from my site or normal request from a certain domainPHP 检查以确保请求是来自我的站点的 xmlhttp 或来自某个域的正常请求
【发布时间】:2011-03-09 20:59:09
【问题描述】:

如何编写条件以确保通过来自我的站点或允许的外部域的 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");
        }
    }
?>

【问题讨论】:

  • 如果您的任何用户使用不包含推荐人信息的代理、防火墙或匿名器服务,您就会遇到问题。
  • 它是我们的业务合作伙伴,既不支持也不使用网络代理。我已经过了不该做的事,需要找出该做的事
  • 检查$_SERVER数组的值,你可能忽略了一些东西。

标签: php logic


【解决方案1】:

考虑到Referer 和X-Request-With 标头都是由客户端(浏览器或任何其他可以发送HTTP 请求的设备)发送(或不发送) em>,他们不能被信任。

您可以将这些用作提示,以增强用户体验;但你不能依赖他们在场或正确。

基本上,您无法确定请求来自特定域(即使对于 XmlHttpRequest :浏览器只能在同一域上使用 XHR...但是您无法确定您收到的请求是否来自 XHR)


在可能的想法中(不确定您真正的问题/需要是什么),您可以尝试使用某种 API 密钥来限制请求率左右?

【讨论】:

  • 好点!永远不要相信来自客户的输入。对正在执行的操作至关重要的所有安全逻辑/验证步骤都应由服务器处理。
  • 我意识到它不是防弹的。它只是阻止大多数人直接访问我的表单的简单机制。碰巧有一个表格需要一个客户访问。可能吗?语法出现错误
  • @Dirty Bird 如果调用是 XMLHHTPRequst,您真的不用担心。您应该只担心其他脚本会调用您的页面。
  • 看,我有一个老板坚持不能直接访问该页面。所以我用jquery .ajax 引入了其中的一部分。我检查会话 ID 以确保您无法直接访问它。现在必须有人能够直接访问它。所以我在这里,一个试图解决这个问题的设计师/前端人员。
【解决方案2】:

您正确拼写了 referrer,但不幸的是编写 HTTP 规范的人不能!您需要使用HTTP_REFERER

您可能还想转义点 \.,以便它只匹配一个点而不是所有内容。

【讨论】:

  • 所以我拼错了,但别人拼错了?这是第一次。
  • 用点表示域\.\com?
  • 无论我做什么,它都会将我重定向到“不允许的页面”
  • 你有没有输出你的 $_SERVER 数组来看看里面有什么? print_r($_SERVER);
  • @Ewan - 它返回了很多东西,我需要寻找一些具体的东西吗?
【解决方案3】:

Ajax 请求只能来自同一个域。由于内在的安全原因,您不能从其他站点发出 XMLHttp 请求。

此站点完美地概述了您无法启动跨域 XMLHTTPRequest 的状态 http://developer.yahoo.com/javascript/howto-proxy.html

所有现代 Web 浏览器都对网络连接施加了安全限制,其中包括对 XMLHttpRequest 的调用。此限制可防止脚本或应用程序连接到网页最初来源以外的任何 Web 服务器(如果在首选项中启用了该选项,Internet Explorer 将允许跨域请求)。如果您的 Web 应用程序和应用程序使用的 XML 数据都直接来自同一服务器,那么您就不会遇到此限制。

【讨论】:

    【解决方案4】:

    您需要注意 HTTP 标头很容易被欺骗,因此有人可以轻松 telnet 并发送该 HTTP 标头并访问该页面。不要依赖 HTTP REFERER 来获取敏感数据。唯一合理安全的预防措施是使用登录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 2010-12-29
      • 1970-01-01
      • 2021-06-21
      • 2012-07-04
      • 2014-08-26
      • 2016-03-06
      相关资源
      最近更新 更多