PHP file_get_contents 服务器检查
Posted
技术标签:
【中文标题】PHP file_get_contents 服务器检查【英文标题】:PHP file_get_contents server check 【发布时间】:2013-02-25 14:23:52 【问题描述】:我的项目有单独的服务器,我想询问所有这些服务器的内容。我发现我必须使用php: file_get_contents
或cURL
,但这是我的问题。我的服务器有没有办法验证哪个服务器可以要求他们执行东西?
例如我使用这个脚本:
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 B
在SERVER 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]
文件指定哪些域能够发出请求。来自其他域的请求将被拒绝。
【讨论】:
我认为这只适用于 Adobe Flash 文件。即使不是这种情况,也必须对请求者进行编码以尊重 crossdomain.xml 文件——它实际上并没有在服务器级别实现任何类型的安全性。以上是关于PHP file_get_contents 服务器检查的主要内容,如果未能解决你的问题,请参考以下文章
PHP file_get_contents() 的行为与浏览器不同
file_get_contents('php://input') 为一个用户返回空,但对其他人工作正常