从(PHP)流包装器错误消息中删除密码?

时间:2016-11-24 12:58:53

标签: php security logging error-handling wrapper

在生产服务器上,错误输出肯定会在常规情况下关闭。不过,即使在我的开发屏幕上,当我看到这样的错误消息时,我也感到很沮丧:

stat(): stat failed for ftp://user:pass@127.0.0.1:21/dir-de-nada

这是在我围绕ftp://流编写的类的上下文中。当然,PHP无法从任意位置过滤掉密码。但在这种情况下(与URL包装器和其他任何地方一样),密码的存在是标准的,也是显而易见的。

我已经抓住了这些错误。然而,我发现自己想知道自己是否需要X这些,只是为了在所有情况下保持安全,或者如果有办法我可以让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调用重新登录。
  5. 假设FTP流上下文适用于一次性基本交易,但对于尝试一次性做任何事情都是严重的,感觉有点像不成熟的alt。 filesys功能的装备。下一步...

1 个答案:

答案 0 :(得分:1)

没有。

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

您可以通过使用不使用URI(FTP或Curl)的API来防止这种情况发生,但这意味着更详细的代码。

在生产系统上禁用错误报告绝对是必需的。但是,启用自己的错误处理程序(在开发/测试以及生产中 - 具有特定于环境的功能)可以提供额外的保护层。

尝试篡改输出流以控制错误消息的内容是非启动性的。但它在你的错误处理程序中肯定是一个好主意。为什么你的正则表达式中有硬编码方案?

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