【问题标题】:PHP: How to detect direct requests of external visitors?PHP:如何检测外部访问者的直接请求?
【发布时间】:2012-12-15 19:42:50
【问题描述】:

我想检测/阻止/转发外部访问者的直接请求。某些脚本只应显示在 jQuery 对话框中。

我当前的代码:

<script>
$(".dialog").click(function() {
    // some code for validation
    // ...
    $("#dialog").load(this.href).dialog();
});
</script>    

<a href="http://domain.de/path/to/form/" class="dialog">Open me in a dialog</a>

这很好,但是如果我在新选项卡/窗口中打开此链接(例如,通过单击鼠标中键),表单将显示为“裸”。

在这种情况下,我想将用户转发到被引用的页面,例如:

if ($requester != $server) {
    header ("Location: " . $_SERVER["HTTP_REFERER"];
}

如何检测 $requester 和 $server?我不想阻止每个脚本或整个目录!

提前致谢!

【问题讨论】:

    标签: php jquery dialog http-referer


    【解决方案1】:

    补充@Dharman 的建议 jQuery 为它的所有 ajax 请求添加了一个名为 HTTP_X_REQUESTED_WITH 的标头,因此您可以简单地在 $_SERVER 全局数组中检查此标头。

    例子:

    if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
    {
        // check if the request is ajax 
        if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
              $_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest' ){
              // ajax content loading
        }
    
        header ("Location: index.php");
    }
    

    【讨论】:

      【解决方案2】:
      if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
      {
          header ("Location: index.php");
      }
      

      【讨论】:

      • 如果通过获取请求方法发布表单,这将不起作用
      • @shawndreck:感谢您的通知!但这只是为了避免用户得到无样式的表单。
      【解决方案3】:

      我有这些值来自外部请求:

      [HTTP_HOST] => 104.219.42.237

      [HTTP_REFERER] => http://someurl.com

      所以,我的解决方案是:

      if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) !== FALSE) {
      
          echo 'same origin/request';
      
      } else {
      
         echo 'different origin/request';
      }
      

      ...

      ...

      ...

      以前的解决方案不起作用的原因!

      在我的情况下: $_SERVER['HTTP_REFERER'] == 'http://someurl.com'

      同时 $_SERVER["HTTP_HOST"] 不包含 'http' 和 'https'

      所以,

      if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
      

      不匹配

      另一个答案

      if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)
      

      在本地主机上不起作用

      【讨论】:

        【解决方案4】:

        是的,您可以使用 $_SERVER['REMOTE_ADDR'] 检查请求发送者的 IP 地址的远程地址。这样做:

        if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)
             echo 'From same server';
        else
             echo 'from different server';
        

        另一个可能的想法解决方案是使用nonce

        • 显示表单时,在其中放置一个隐藏的输入字段,包含 一个随机值

        • 同时,将该随机值存储到会话中 对应用户。

        • 表单提交时,检查隐藏字段是否相同 值作为存储在会话中的值。

        如果这两个值不相同,则拒绝使用提交的数据。

        注意:这个想法经常被用来帮助对抗 CSRF - 并集成在一些框架(例如 Zend 框架)的“表单”组件中。

        【讨论】:

        • 用户的浏览器在两个实例中都请求表单,比较IP地址是没有用的。
        • REMOTE_ADDR 表示请求来自的地址,如果站点的用户与服务器不在同一个本地主机上,则该地址将有所不同
        • 所以当用户的浏览器请求php文件时,他可以做检查仪式。
        猜你喜欢
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多