2016-11-24 36 views
0

在生产服务器上,错误输出无疑是常规问题。不过,我感觉心惊肉跳,当我看到连我的dev的屏幕上像这样的错误消息:从(PHP)流包装器错误消息中移除密码?

stat(): stat failed for ftp://user:[email protected]:21/dir-de-nada 

这是一类我周围的ftp://流写的情况下。当然PHP不能过滤任何位置的密码。但在这种情况下(如URL封装和其他任何地方),密码的存在是标准和明显的。

我已经在捕捉错误。然而,我发现自己想知道是否需要自己动手编写这些代码,只是为了在所有情况下都安全起见,或者我可以让PHP自动和全局地执行这些操作。(这里就是这个问题。)我猜测没有,但是在这里的探索中没有任何伤害。

至于我担心什么,它只在我的开发屏幕上。但是,错误报告也可能与网站管理员等有关,他们可能不需要知道FTP密码。让FTP密码脱机进入错误日志不是一件值得关注的问题,而是将其保存到数据库中的报告等 - 我真的不希望这类信息随时随地传播,原因很明显。预防指针好吗?

如果有人觉得在保持PHP脱离密码等敏感信息的任何情况下,这也是值得欢迎的。除了“不输出任何东西”。


编辑:更好的选择之前,我的错误和异常处理的消息部分现在运行此:

$msg = preg_replace('#((ftp|http)://)([^@]+?)@#', '$1*:*@', $msg); 

如果使用SSH2流工作,在正则表达式的情况下,增加对ssh2\.(shell|exec|sftp|scp)关注。并且,如果您使用显示参数的堆栈轨迹,则可以对其进行清理。


EDIT2:在与PHP的FTP流上下文包装经验的备忘。

  1. 如果有任何失败的请求,给出重复的脚本超时,尤其会执行糟糕的操作。
  2. 流回调(在create_stream_context/$param['notification']中定义)主要记录空白/部分,而不是来自FTP服务器的完整响应。
  3. 使用流上下文的文件系统函数可能会或可能不会返回适当/一致的错误,或记录任何回调。 (如果有人想要故障的细分,请去问)
  4. 似乎没有持久连接的选项:即使我回收了stream_context_create资源,PHP也会在同一脚本中为每个filesys调用重新登录。

假设FTP流上下文适用于一次性基本事务,但是对于尝试在一次去做更多事情方面没有问题,感觉有点像不成熟的ALT。用于filesys功能的装备。下一个...

回答

1

我认为在stream context中有一个可以配置用户名和密码的参数,但这是not an option

您可以通过使用不使用URI的API(FTP或Curl)来避免此问题,但这确实意味着更详细的代码。

在生产系统上禁用错误报告肯定是一项要求。但是启用自己的错误处理程序(在开发/测试以及生产环境中具有特定的功能)提供了一个额外的保护层。

试图篡改输出流以控制错误消息的内容是非启动器。但是它在你的错误处理器中当然是一个好主意。你为什么在你的正则表达式中使用硬编码方案?

#(([a-zA-Z]+)://)([^@]+?)@# 
+0

使用FTP扩展将是另一个依赖项,并且alas Curl需要更多的代码。另外我希望ftp流包装会表现得更好,而不是我会写一个Curl版本来进行基准测试。至于正则表达式,我实际上是按照你对初学者所做的那样写的(N.B.需要ssh2。*东西的'[a-z2。]')。但由于只有三个内置的流密码上下文,即。 ftp,http和ssh2,使匹配更少。没有必要清理其他流上下文的数据? –

+0

是的,似乎我正在将我的包装类移植到FTP和/或Curl后面,ftp://流包装器的表现就像陈旧的s ** t(请参阅上面的Edit2)。在这里,我认为这是一件漂亮而光滑的事情。似乎该功能还相当不成熟,至少就ftp://流而言。没有那么多的代码在Curl的一天结束时,用一些方法来管理散装。可能只是直接访问FTP模块,至少看起来它实际上是专门用于正确使用FTP的。 –

+0

我正在阅读Curl应该表现更好。据我所知,FTP模块建立在流上下文之上。似乎并未默认启用,因此Curl适用于下一版本。 –