【问题标题】:Pass database handler to exception将数据库处理程序传递给异常
【发布时间】:2013-12-26 23:23:26
【问题描述】:

我想在检测到attack 时将某些内容记录到数据库中。类定义和 throwing 是分开的,但为了简单起见在这里加入了它们。我在想:

<?php
class Attack extends Exception {
  public function __construct($message, $code = 0, Exception $previous = null, $DB, $IP) {
    $STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
    $STH->execute(array($IP));
    parent::__construct($message, $code, $previous);
    }
  }

// code

if (!empty($_POST['honeypot']))
  throw new Attack($IP . " submitted a filled in honeypot", 0, null, $DB, $IP);

但我也可以考虑这个更简单但更严格的方法:

<?php
class Attack extends Exception {
  public function __construct($message, PDO $DB, $IP) {
    $STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
    $STH->execute(array($IP));
    parent::__construct($message);
    }
  }

// code

if (!empty($_POST['honeypot']))
  throw new Attack($IP . " submitted a filled in honeypot", $DB, $IP);

我什至不确定这是否有效,但还有这个:

<?php
class Attack extends Exception {
  public function __construct($message, $code = 0, Exception $previous = null) {
    parent::__construct($message, $code, $previous);
    }
  public function block ($DB, $IP) {
    $STH = $DB->prepare("INSERT INTO blocked (`type`, `value`) VALUES ('ip', ?)");
    $STH->execute(array($IP));
    }
  }

// code

if (!empty($_POST['honeypot'])) {
  $e = new Attack($IP . " submitted a filled in honeypot");
  $e->block($DB, $IP);
  throw $e;
  }

我只想在检测到攻击时将 IP(可能还有其他一些数据)保存到数据库中。每种方法的优缺点是什么?你能想到其他方法吗?

在抛出异常的同时将某些内容记录到数据库中时最常用的方法是什么?

【问题讨论】:

  • 在调用自定义函数的地方使用set_exception_handler 怎么样。在该自定义函数中,您可以调用全局数据库处理程序,或使用自定义静态类来查询数据库。现在您不需要扩展 Exception 类并更改项目中的整个代码...

标签: php exception pdo exception-handling cracking


【解决方案1】:

这里不需要例外。

如果用户到达目的地,这绝不是一个例外情况,而是相当正常的情况。因此,只需处理此请求,就像处理任何其他用户操作一样,没有例外。

【讨论】:

  • 它实际上是在一个if 中检查是否有一个蜜罐被提交,在正常情况下它应该是空的。更新了问题以反映这一点。有了这些附加信息,这不是引发异常的好案例吗?
  • Honeypot 与其他地址相同。为什么你认为你必须以其他方式处理它?异常代表异常,不可预测的情况。而你想要的是一个常规的程序流程。为什么你想要一个例外?这是唯一可能发生此类问题的地方。为什么不想只使用一个条件?
  • 我一直是reading more on Exceptions,现在我明白你的意思了。然而this 似乎也是一个有效的意见。这些天我正在努力学习如何正确使用它们。所以我需要一个条件,然后,比如说,添加一个像block_user($DB); 这样的函数,对吧?你知道有什么好书/教程来学习如何使用它们吗?因为我找到的所有内容都是关于扩展 Exception 而不是何时使用它们的教程。
  • 不,抱歉。我知道没有教程。我正在使用我的常识和经验。至少有一条经验法则:如果你要扔的地方只有一个地方 - 很可能你在这里不需要例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多