PHP file_get_contents 服务器检查

Posted

技术标签:

【中文标题】PHP file_get_contents 服务器检查【英文标题】:PHP file_get_contents server check 【发布时间】:2013-02-25 14:23:52 【问题描述】:

我的项目有单独的服务器,我想询问所有这些服务器的内容。我发现我必须使用php: file_get_contentscURL,但这是我的问题。我的服务器有没有办法验证哪个服务器可以要求他们执行东西?

例如我使用这个脚本:

 function is_ajax() 

     // BOOLEAN return if AJAX
     return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';

 

检查请求是否基于 AJAX。

如果有办法使用它们,我可能会访问每个服务器的 IP 地址。

SERVER A 验证了一些信息之后,我可以说我想要执行的一件事是在SERVER B 上启动一个会话。因此,为了防止其他服务器和脚本在未经许可的情况下执行,我想要一种方法让我的 SERVER B 验证它实际上是 SERVER A 在询问的人。

编辑: 我正在使用会话类在SERVER A 上创建会话,该会话类将加密的数据保存在 SQL 数据库中。

也可以使用会话 cookie 参数

     session_set_cookie_params(
        $cookieParams['lifetime'],
        $cookieParams['path'],
        $cookieParams['domain'],
        $secure,
        $httponly
     );

即使服务器不同,它们共享相同的域名但在服务器的子域中分开,所以也许一种方法是让SERVER BSERVER A 看到会话,然后创建一个类似的会话?

【问题讨论】:

你不能随请求一起提交某种共享密钥,比如一个长的随机字符串作为 HTTP 参数吗? @complex857 我觉得应该可以破解... 当然可以,但只要您的通信渠道不是纯文本,并且您的代码不是公开的(可能是来自环境变量的配置参数,因此不会提交到源代码控制)应该没事。如果您不希望它出现在服务器日志中,您可以使用 HTTP POST。取决于您要寻找的安全级别。 @PhilipJensBramsted:complex857 的建议虽然不是超高级别的安全性,但绝对比依赖$_SERVER 数据更安全。也许是两者的结合......正如他所说,这完全取决于您需要什么级别的安全性。 我不是那种偏执狂,但我有点完美主义,我一直在努力使其他一切尽可能安全。检查了它。也许它会提供其他可能性。 【参考方案1】:

如果您将会话存储在 memcached 等集中式数据存储中,那么如果您的服务器从同一个域访问它们,它们将共享相同的会话。 PHP 支持将会话存储在 memcached 中,因此您只需对其进行配置(session.save_handler)即可。然后您的所有会话代码仍将按原样工作,但您的会话将在服务器之间共享。

【讨论】:

我假设我需要将它存储在memcach 和数据库中。那么这仍然足够安全吗? 顺便说一句..之前没说,但是服务器只共享相同的域名..有子域分布在不同的服务器上.. 不,会话只会存储在内存缓存中。将 memcache 视为内存中的数据库。您可以使用 session_set_cookie_params 在基本域上设置会话。然后,您将进行单点登录。这可能不是我们想要的。 我与我的同事和服务器管理员交谈。他同意你的观点,这基本上也是这个想法,但问题是两台服务器不能互相看到,并且不是本地网络的一部分。它是 hostgator 上的两个独立的虚拟服务器..【参考方案2】:

我选择 ?SOMEPASSWORDVARIABLE=LONGSPASSWORDWITHRANDOMCHARS 正如@complex857 所建议的那样。

由于 file_get_contents 是在服务器端运行的,所以很难猜到文件名 file 变量和密码,如果可以通过监控来自服务器的流量来监控实际请求,但可能性很小

【讨论】:

现在好了.. 请验证这是否足够安全.. 我已经构建了一个加密类,它加密了一个包含我想从中创建会话的变量的array()。在我加密array() 之前,我插入了一个已经加密的密码——这给了我一个加密密码的加密版本。接下来,我在 URL 查询字符串中将其发送到下一个服务器,该服务器使用类似的 salt 解密数组,该 salt 本地化在存储在 Web 根目录之外的私有变量中。它使用另一个salt以同样的方式存储array()中的密码... ... 继续。此密码将与 webroot 之外的另一个目录中本地化为私有变量的密码进行比较,如果这些密码匹配,服务器将使用解密数组中的数据创建会话。 @PhilipJensBramsted 听起来对我来说足够安全 :) 最重要的是,我通过 cURL 将请求作为 $_POST 发送【参考方案3】:

使用[crossdomain.xml][1] 文件指定哪些域能够发出请求。来自其他域的请求将被拒绝。

【讨论】:

我认为这只适用于 Adob​​e Flash 文件。即使不是这种情况,也必须对请求者进行编码以尊重 crossdomain.xml 文件——它实际上并没有在服务器级别实现任何类型的安全性。

以上是关于PHP file_get_contents 服务器检查的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用curl替代file_get_contents

PHP file_get_contents() 函数

PHP file_get_contents() 的行为与浏览器不同

file_get_contents('php://input') 为一个用户返回空,但对其他人工作正常

Heroku PHP - 从 Heroku 服务器到自身的 file_get_contents 导致 H12 请求超时

PHP file_get_contents 函数无法使用 Cloudflare(网络服务器代理)