8

我收到混合信号。PDO 文档中的警告似乎很清楚,省略 try-catch 可能会危及安全性。但是,这个线程表明它并不是真正必要的。在我看来,将每个查询包装在 try-catch 中会很烦人。关于如何处理这个问题的任何建议?

4

3 回答 3

10

存在安全风险,但您不需要到处添加 try/catch。风险在于,如果您没有捕获异常,则异常的错误消息(可能包含敏感信息)可能会显示给用户。

但正如文档所述,您可以改为添加一个异常处理程序。通过重定向到一般错误消息,您可以避免向用户显示错误消息中的敏感信息。

在任何情况下,设置一个通用的错误处理程序似乎都是一件非常明智的事情。您不想向用户显示神秘的错误消息。即使您确实采用“尝试/捕获所有内容”的方法,也很难 100% 确定您已捕获所有可能发生的异常,因此异常处理程序仍应用作后备。

于 2012-06-30T05:33:44.310 回答
3

PDO 具有三种可配置的错误模式。默认只是设置错误代码,不抛出异常。

但是,您应该使用PDO::ERRMODE_EXCEPTION. PHP 和 PDO 通常处理错误的方式(即默默地继续编写代码并在不告诉你的情况下做错事)绝对是疯狂的,也是 PHP 可怕的一个重要原因。

如果您的查询出现问题,正确的做法是停止执行并引发异常,以便您有清晰的回溯并可以找到并解决问题。

另外,使用 try-catch 比在每个查询之后检查errorCode和检查要容易得多(即,不那么“烦人”) 。errorInfo如果您预计错误的可能性并且可以对此采取一些措施,您应该只使用 try-catch - 否则您应该让异常冒泡。如果这是一个意外错误,它可能来自您的代码中的错误,您应该通过异常了解它,以便您可以修复它!

如果您想在报告异常时做一些特别的事情(例如,漂亮地打印它,给您发送电子邮件,等等),然后注册一个默认异常处理程序来处理任何未捕获的异常。在生产系统上,您应该注册一个默认的异常处理程序,该处理程序显示一个通用的 500 页面并显示错误详细信息,并在其他地方记录完整的回溯以进行调试。

于 2012-06-30T05:42:06.493 回答
1

如果可能发生错误,那么它最终发生。无论您运行的环境如何,您都需要处理 PDO 查询可能生成的任何潜在错误。假设(正如您发布的线程中的人所做的那样)由于这是一个生产系统,因此不需要 try..catch 是愚蠢的,恕我直言。错误不仅会在您调试代码时引发,而且也可能发生在生产系统上。就我个人而言,我喜欢围绕我在日志中看到的错误了解上下文,所以我确实使用 try..catch 来处理我的查询。

这也与您最终呈现给用户的错误无关。我发现在这种情况下使用安全这个词会使事情变得模糊。无论您如何处理错误(这不是 PDO 特定的),您的系统都不应向用户显示神秘的错误消息(可能包括敏感数据)。

有几种方法可以处理这个问题:

  1. 通过传递一个已经绑定了所有内容的准备好的语句,创建一个函数来为您执行 PDO 查询。
  2. 创建一个全局异常处理程序并在那里捕获任何异常(我不喜欢这种方法,因为你最终会丢失上下文......如果它被某个全局处理程序捕获,我会向用户显示什么错误?你如何从这样的如果在某些全局上下文中捕获错误?)。
  3. 初始化 PDO不要抛出异常并进行手动错误检查,如果那是你的毒药。就个人而言,我发现异常与基于 OOP 的系统更好地结合,但对每个人来说都是他自己的。

我的2c。

于 2012-06-30T05:44:37.500 回答