我收到的信号很复杂。PDO documentation中的警告似乎非常清楚,省略try-catch可能会损害安全性。然而,this thread认为这并不是真正必要的。在我看来,将每个查询都包装在try-catch中是非常烦人的。对如何处理这件事有什么建议吗?
发布于 2012-06-30 13:33:44
虽然存在安全风险,但您不需要在所有地方都添加try/catch。风险在于,如果您没有捕获到异常,则来自该异常的错误消息(可能包含敏感信息)可能会显示给用户。
但正如文档所述,您可以改为添加一个exception handler。通过重定向到一般错误消息,可以避免向用户显示错误消息中的敏感信息。
在任何情况下,设置通用错误处理程序似乎都是非常明智的做法。您不希望向用户显示模糊的错误消息。即使你采用了“尝试/捕获一切”的方法,也很难100%确定你已经捕捉到了所有可能发生的异常,所以异常处理程序仍然应该被用作后备。
发布于 2012-06-30 13:42:06
PDO有three configurable error modes。默认设置只是设置错误代码,而不是抛出异常。
但是,您应该使用PDO::ERRMODE_EXCEPTION。PHP和PDO通常处理错误的方式(例如,默默地按下代码并在没有通知你的情况下做错误的事情)是绝对疯狂的,这也是PHP可怕的一个重要原因。
如果您的查询出现问题,正确的做法是停止执行并抛出异常,这样您就可以有一个清晰的回溯,并可以找到并修复问题。
此外,与在每次查询后检查errorCode和errorInfo相比,使用try-catch要容易得多(也就是说,不那么“烦人”)。只有在预料到可能出现错误并且可以采取措施的情况下,才应该使用try-catch --否则就应该让异常冒泡起来。如果它是一个意外的错误,它可能来自你的代码中的错误,你应该通过异常来了解它,这样你就可以修复它!
如果你想做一些特殊的事情来报告异常(例如,漂亮地打印出来,给你发一封电子邮件,等等),那么注册一个default exception handler来处理任何未捕获的异常。在生产系统上,您应该注册一个默认的异常处理程序,该处理程序显示一个通用的500页面,错误详细信息很少,并在其他地方记录完整的回溯以进行调试。
发布于 2012-06-30 13:44:38
如果发生错误can,那么它最终将。无论在什么环境下运行,您都需要处理PDO查询可能生成的任何潜在错误。假设(就像你之前发布的帖子里的人那样),既然这是一个生产系统,try..catch就不是必要的,这是愚蠢的。错误不仅在调试代码时抛出,在生产系统上也可能发生。就我个人而言,我喜欢在我的日志中看到的错误周围有上下文,所以我实际上在我的查询中使用try..catch。
这也与最终呈现给用户的错误无关。我发现在这种情况下,使用安全一词会使事情变得模糊。无论您如何处理错误(这不是特定于PDO的),您的系统都不应该向用户显示隐秘的错误消息(可能包含敏感数据)。
有几种方法可以处理此问题:
我的2c.
https://stackoverflow.com/questions/11271699
复制相似问题