3

我最近刚刚阅读了一篇关于http://phpmaster.com/exceptional-exceptions/的文章,他谈到了异常:

您的调用代码永远不应该阅读该消息。该消息唯一对开发人员有利。

在 W3Schools 网站上,他们展示了一个示例,当异常消息被捕获时会输出异常消息,所以我很困惑。我从http://www.phpmaster.com学到了很多东西,并且相信他们所说的,但是 W3Schools 也总是可靠的,所以正确的做法是什么?

异常消息应该输出给用户还是只是开发人员的东西?也许它甚至没有那么重要,并且可以双向使用而不会造成任何伤害?

4

5 回答 5

2

这取决于场景,但最大的问题是安全性。当开发人员抛出异常时,他们通常会尝试在消息中包含一些关于究竟出了什么问题的有用信息。他们不知道在当前情况下您是否会认为该信息是敏感信息。

例如,假设您有一个包含登录表单的网站。如果Users数据库中的表丢失并且有人尝试登录,则抛出的异常可能类似于Unable to find table users in database MyDb (db.mysite.com)

如果该消息显示给恶意用户,他们现在知道您的数据库在哪里以及 db/table 名称是什么。

在这种情况下,我倾向于使用唯一的 ID 记录完整的异常并将该 ID 显示给用户,以便他们稍后可以在需要时与我跟进。

相反,如果它是桌面应用程序,那么我倾向于另一种方式 - 异常消息可以帮助最终用户(例如Access Denied,用户可能能够解决的问题)。即使这样,您也不确定异常消息是否有用(ala Reference not set to an instance of an object)所以我倾向于将任何异常包装在更有用的消息中(例如Unable to connect to database)并公开所有内部异常的列表。这意味着用户会收到可以理解的消息,但如果可用,也可能会获得更多有用的信息,而不是安全风险

于 2013-02-23T16:42:22.150 回答
1

没有一个明确的答案。这取决于消息提供的信息。
如果您的消息不提供任何敏感信息,您可以将它们打印给客户。

我喜欢使用$code参数来将错误打印到客户端。
像这样的东西:

function clientError(Exception $e) {
    $error = 'Unknown error!';
    switch ($e->getCode()) {
        case 404:
            $error = 'Not found error!';
            break;
        case 403:
            $error = 'You cannot access this page!';
            break;
        ...
        ...
    }
    return "$error [error code: {$e->getCode()}]";
}

将错误信息保存在错误日志中,并将 clientError 打印到客户端:

try {
    if (!$user->isMember()) {
        throw new Exception("Guest {$user->id} tried to access to newPost.php page", 403);
    }
}
catch (Exception $e) {
    $errorLog->newError($e);
    echo clientError($e);
}

此示例应在错误日志中添加一行消息:
“Guest 123 尝试访问 newPost.php 页面”
并打印:
“您无法访问此页面!”

于 2013-02-23T16:52:40.170 回答
1

几乎是对的。您当然不想用 Stackframe 来呈现黑客类型。向用户展示它们也不是那么有用。话虽如此,遵循这个建议,因为它被提出来陷入陷阱。

有时您获得的异常类过于通用,识别它的唯一方法是测试文本。OLE 是经典的。无论如何,运行一条你得到 OLEDB 异常的 sql 语句。另一个相关的问题是当您尝试 catch end 并假设将抛出的唯一异常是您认为可能的异常,然后您得到一个用户打电话说我收到“保存您的文档时出现问题",这可能是一大堆问题中的任何一个。

不管你做什么,如果你得到它,你会记录原始异常和堆栈帧。这很明显,但太多人掉进了这个陷阱。

不要将问题简化为您提供的信息是完全无用的路线。

Even exceptions for devs have gone down that route Access Violation 0000000 at 0000000 was a good one, "Unknown ole error(5)" was brilliantly stupid, or the ever annoying msi one "error 1603".

于 2013-02-23T16:59:11.297 回答
0

重新 W3Schools:http ://w3fools.com/

例外仅适用于开发人员。它们可能包含有助于攻击者入侵您的网站的信息,而且它们并不漂亮。如果您期望它发生异常并执行用户期望的操作,例如显示他们可以理解的错误消息,请捕获该异常。如果您没想到会发生异常,那么您有一个需要修复的问题。

未捕获的异常也称为“错误”;)

于 2013-02-23T16:41:46.017 回答
0

由于缺乏编程经验,大多数异常对最终用户没有帮助,您应该处理自己的异常并向最终用户发出明确的信息

于 2013-02-23T16:42:23.557 回答