【问题标题】:When should you prepare and execute using `try` and `catch` using PDO?什么时候应该使用 PDO 使用 `try` 和 `catch` 准备和执行?
【发布时间】:2021-05-02 17:10:06
【问题描述】:

我已经使用 PDO 几年了,但我从未完全研究过何时应该使用 trycatch 准备和执行。

我的理解是,当数据可能包含用户输入时,您应该使用trycatch

所以例如这段代码是安全的:

public function getDetails($filename, $what){
    $query = $this->handler->prepare('SELECT * FROM videos WHERE v_fileName = :v_fileName');
    try{
        $query->execute([
            ':v_fileName' => $filename
        ]);
    }catch(PDOException $e){
        return $e->getMessage();
    }
}

$filename 在这个例子中是来自 URL 的东西。

当没有从 URL 中得到任何东西时,例如这样它也完全保存:

$query = $this->handler->prepare('SELECT * FROM videos WHERE u_id = :u_id ORDER BY v_id LIMIT :climit,1');
$query->execute([
    ':u_id'     => $this->user->getChannelId($userid),
    ':climit'   => $optional[1]
]);

$fetch = $query->fetch(PDO::FETCH_ASSOC);

我对准备陈述的理解是否正确,如果不正确,我应该怎么做?

【问题讨论】:

    标签: php exception pdo


    【解决方案1】:

    只有当你有充分的理由这样做时。

    这不仅仅适用于 PDO 异常。任何例外情况也是如此。仅当您的代码可以从中恢复并执行其他操作时才捕获该异常。

    仅捕获 echoreturn $e->getMessage(); 的异常不是正当理由。您的代码无法从问题中恢复,您只是在阻碍异常。

    您可能想要恢复的一个很好的例子是,如果您正在使用数据库事务,并且在发生故障时,您想要回滚并执行其他操作。您可以在catch 中调用PDO::rollBack(),然后让您的代码执行一些替代逻辑。

    Try-catch 不是一种安全措施。它与用户输入无关。它仅在您预计代码会失败但您有计划 B 来处理这种情况的情况下使用。

    更多信息可以阅读My PDO Statement doesn't work和文章PHP error reporting

    【讨论】:

    • 我通常只在编辑时使用它,当它投入生产时,我将其更改为错误消息,说明出现问题。
    • 不,这是您的错误处理程序负责的。您的错误处理程序应该捕获所有异常和错误,将它们记录到文件中,并向用户显示一个漂亮的 500 错误页面。这绝不是特定于 PDO 逻辑的。
    • 为什么错误处理程序应该对此负责?错误消息有什么问题或不安全?
    • 这不是不安全的。这只是一个非常非常混乱的代码。您可以拥有一个处理所有错误的全局错误处理程序,而不是为每一行代码提供错误消息。用户不需要知道究竟是什么坏了,这就是错误日志的用途。你可以在这里找到更多信息stackoverflow.com/questions/32648371/… 和这篇文章phpdelusions.net/articles/error_reporting
    • 如果您将ini_set('display_errors',1); 留在生产代码中,那将是不安全的。确保您的生产系统永远不会向用户显示内部错误。
    【解决方案2】:

    我对准备陈述的理解是否正确,如果不正确,如何 我应该这样做吗?

    您使用准备好的语句来避免SQL INJECTION。 准备好的语句会引用参数来避免它。

    我的理解是,当数据可能出现时,您应该使用 try 和 catch 包含用户输入

    try catch 块用于处理应用程序中的错误,与准备好的语句无关。

    【讨论】:

    • SQL注入不能只发生在用户输入上吗?如果是这样的话,那么我这样做的方式很好,对吧?
    • @Tom 不,当您将 PHP 变量与 SQL 字符串混合时会发生 SQL 注入。当您使用参数绑定时,应该没有 SQL 注入的风险。
    • 我的问题不是关于参数绑定,而是关于何时使用trycatch
    • @Dharman 如果我错了,请纠正我,但是 PHP 中设置的变量(不是来自用户输入)没有(恶意)SQL 注入的风险(当然,除非字符串PHP中设置的作者本身就是恶意的)?
    • @GrumpyCrouton 也许,但我不会相信任何变量。根据定义,它们的值会发生变化,因此您无法确保直接被感染是安全的。只绑定所有变量输入会更容易。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2015-12-05
    • 2014-09-19
    相关资源
    最近更新 更多