在PHP和include中保护第三方API凭据


Securing third-party API credentials in PHP and include

我正在编写一系列与第三方api交互的函数,这些函数将包含在其他PHP脚本中。这些第三方api大多使用基于令牌的身份验证,因此我希望将这些令牌存储在函数中,但我想知道防止在所包含的文件中利用这些函数的最佳实践是什么。

例如,在一个名为~/public_html/includes/functions.php的脚本中,我将定义一些函数,这些函数使用cURL调用公共API,然后从API返回某种响应。然后,在我的应用程序中,我将包括~/public_html/includes/functions.php并调用与第三方api交互的函数。

我担心的是,如果别人包括http://www.example.com/includes/functions.php在他们的脚本,并开始调用我的函数使API调用使用我的凭据?php应该在其他地方,也许在~/public_html目录之外吗?或者也许我可以使用UNIX权限来阻止任何人,但我自己的应用程序包括functions.php脚本?

我关心的是如果别人包括http://www.example.com/includes/functions.php在他们的脚本中,和开始调用我的函数使用我的凭据进行API调用?function .php应该放在其他地方吗~/public_html dir吗?或者我可以使用UNIX权限来防止除了我自己的应用程序包括函数。php脚本吗?

你把很多事情搞混了。长话短说:你不应该担心。我在这个回答中完整地解释了include如何与url一起工作。以下是你的目的的摘要。

具体来说,虽然可以使用include来包含完整的url,如include('http://www.google.com/');,但您从include中获得的唯一东西是页面的最终呈现内容。100%没有函数,类,变量,字符串,常量或任何包含在PHP代码的内部。或者正如你所链接到的PHP文档中所解释的那样;我特别强调:

如果在PHP中启用了"URL include wrapper ",你可以指定文件使用URL(通过HTTP或其他支持的包装器)包含-参见支持的协议和包装器(协议列表),而不是当地的路径名。如果目标服务器将目标文件解释为PHP代码中,变量可以通过URL请求传递到包含的文件与HTTP GET使用的字符串。严格来说,这是不一样的包括文件并让它继承父文件变量作用域;脚本实际上是在远程服务器上运行的然后将结果包含到本地脚本中。

因此,您不能以您所描述的方式远程包含凭据或任何PHP内部构件。唯一可能发生的方法是在本地包含~/public_html/includes/functions.php。这就是PHP内部机制暴露的时候。

或者更好的理解方式:当您通过http://https://请求PHP文件时,它被解析为&通过Apache中的PHP模块进行处理。因此,它只返回最终产品——如果有的话——通常由echo语句传递。

但是当您通过本地文件系统包含一个文件时,它是而不是Apache中的PHP模块解析的。它只是原始代码。这就是如何使用函数,类,变量,字符串,常量以及PHP代码内部包含的任何内容。