将数据库处理程序传递给异

时间:2013-12-26 23:23:26

标签: php exception pdo exception-handling cracking

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

<?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(可能还有其他一些数据)保存到数据库中。每种方法有哪些优缺点?你能想到其他任何方法吗?

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

1 个答案:

答案 0 :(得分:0)

这里不需要例外。

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