【问题标题】:Only allow my server to execute a script in PHP只允许我的服务器在 PHP 中执行脚本
【发布时间】:2012-11-11 16:41:52
【问题描述】:

防止从其他主机执行PHP 脚本的最佳方法是什么?基本上,我只希望我的服务器 web1.mydomain.com 执行 PHP 脚本。现在,如果我创建一个带有iframeimg tag 的html 文件,它指向我在不同域上的脚本并调用它,它就会工作并执行。我想防止这种情况发生。

是否可以在 Web 服务器级别而不是 PHP 应用程序代码中执行此操作?我正在使用nginx。这将是最好的解决方案。

【问题讨论】:

    标签: php security nginx xss csrf


    【解决方案1】:

    要防止页面嵌入到您域外的框架中,您可以设置X-Frame-Options 响应标头以防止来自其他域的页面将其嵌入到 iframe 中(只要浏览器服从)。

    在 nginx 中,您可以将其添加到配置中:

    add_header X-Frame-Options SAMEORIGIN;
    

    对于 Apache:

    Header always append X-Frame-Options SAMEORIGIN
    

    https://developer.mozilla.org/en-US/docs/The_X-FRAME-OPTIONS_response_header


    <img>标签可以查看$_SERVER['HTTP_REFERER']

    if(isset($_SERVER['HTTP_REFERER'])){
        if(preg_match("@^http://web1.mydomain.com($|/.*)@", $_SERVER['HTTP_REFERER']) != 1){
            die;
        }
    }
    

    此方法依赖于用户代理设置的HTTP_REFERER。我认为这应该适用于大多数情况。不幸的是,我无法测试。

    我认为这也阻止了 AJAX?...

    实际上它还阻止用户使用<a> 标签链接到您的网页,所以我不会说这是一个非常好的...

    【讨论】:

    • 如果这可行,假设它不会给您的页面请求带来额外负载,这可能是最好的方法。
    • 很好,add_header nginx 指令就像一个冠军。但这不能防止imgajax 请求吗?
    • 我可以使用$_SERVER['HTTP_HOST'] 还是总是说web1.mydomain.com,即使请求可能来自img 或来自不同主机的AJAX 请求?
    • @Justin $_SERVER['HTTP_HOST'] 始终为 web1.mydomain.com(除非另一个域指向您的 IP 并被使用)。
    【解决方案2】:

    这似乎是 valid_referers nginx 指令的教科书案例。

    在您的脚本的location-block 中添加如下内容:

    valid_referers web1.mydomain.com;
    

    或者,如果您想不那么严格,并且更容忍剥离/混淆的引用:

    valid_referers none blocked web1.mydomain.com;
    

    查看http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers了解更多信息

    【讨论】:

    • 太棒了,valid_referers 效果很好。这是代码:valid_referers server_names *.my-domain.io; if ($invalid_referer) { return 403;}
    【解决方案3】:

    如果您有权访问您的 apache 配置文件,您可以执行以下操作:

    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
    

    之后您可能需要添加类似的内容:

    <FilesMatch "*\.(css|js|gif|jpg|png)$">
      Order Allow,Deny
      Allow from all
    </FilesMatch>
    

    【讨论】:

    • 这不会阻止任何人执行脚本。这不是我想要的,我想防止从不同于web1.mydomain.com 的主机运行脚本。
    • 没有。这可以防止除 127.0.0.1(您的服务器)之外的任何人执行该文件。
    • 使用deny all; allow 127.0.0.1; 不起作用。它阻止用户的所有请求。
    【解决方案4】:

    您可以使用 nginx 主机配置来做到这一点。将以下代码放入所有主机 server 块中,您希望允许执行的块除外。

      location /myscript {
        deny all;
      }
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2016-07-18
      • 2015-04-03
      相关资源
      最近更新 更多