【发布时间】:2017-04-08 19:04:41
【问题描述】:
在生产服务器上,错误输出肯定是例行公事。尽管如此,即使在我的开发屏幕上看到这样的错误消息,我还是会感到紧张:
stat(): stat failed for ftp://user:pass@127.0.0.1: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 流上下文包装器的经验的一般说明。
- 如果有任何失败的请求,特别是执行糟糕的,给出重复的脚本超时。
- 流回调(在
create_stream_context/$param['notification']中定义)主要记录空白/部分,而不是来自 FTP 服务器的完整响应。 - 使用流上下文的文件系统函数可能会也可能不会返回正确/一致的错误,或将任何内容记录到回调中。 (如果有人想了解故障,请尽管询问。)
- 似乎没有持久连接的选项:即使我回收了
stream_context_create资源,PHP 也会为同一脚本中的每个 filesys 调用重新登录。
假设 FTP 流上下文对于一次性基本事务来说很好,但是对于尝试一次性做更多事情的严重否定,感觉有点像不成熟的替代品。用于文件系统功能的装备。接下来...
【问题讨论】:
标签: php security logging error-handling wrapper