在 Cakephp 中,如果我使用直接的 mysql 查询而不是使用模型,如何防止 sql 注入


In Cakephp, how to prevent sql injection if I use direct mysql queires rather than using models?

我必须处理大型mysql DB。具有大量计算(在选择子句中)和 where 子句中的几种条件的 SQL 查询。因此,我决定使用行/直接 sql 查询来处理数据库,方法是使用 $db = ConnectionManager::getDataSource('default');

如果我使用它,如何防止 mysql 查询中的 sql 注入?"mysql_real_escape_string"不再存在。有没有办法在CakePHP中使用PDO?

您可以在控制器(或组件)中使用它

// Initiate PDO connection
$this->_pdocon = $this->WhateverYourModel->getDataSource()->getConnection();
try {
    // Select Query
    $company = "What";
    $stmt = $this->_pdocon->prepare('SELECT * FROM `agents` WHERE `company` LIKE :company LIMIT 2');
    $stmt->bindValue(':company', $company, PDO::PARAM_STR);
    // Start transaction
    $this->_pdocon->begin();
    // Loop through the events
    if( $stm->execute() ) {
        while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)) {
            $stmt2 = $this->_pdocon->prepare("INSERT INTO `company` 
                        (`id`, `name`, `identityno`, `modified`, `created`) 
                        VALUES 
                        (NULL, :name, :identityno, NOW(), NOW())");
            $stmt2->bindValue(':name', $row['name'], PDO::PARAM_STR);
            $stmt2->bindValue(':identityno', $row['id'], PDO::PARAM_INT);
            $stmt2->execute();
        }
    }
    // Commit transaction
    $this->_pdocon->commit();
    // Get last insert Id
    $row_id = $this->_pdocon->lastInsertId();
    var_dump($row_id); 
} catch (PDOException $e) {
    // Rollback transaction
    $this->_pdocon->rollback();
    echo "! PDO Error : " . $e->getMessage() . "<br/>";
}

这就是我最终的结果。使用PDO已经解决了数千个问题。现在系统速度很快,没有内存耗尽错误。而且我不能把所有的问题,我得到的错误,放在我的问题中。在这里给出直接答案而不是尝试更改问题很好!

cakePhp 的很大一部分意义在于不要这样做。因此,我建议不要这样做。

Cakephp有一个自己的实现来访问数据库,如果可能的话,你应该使用它。你想绕过它有什么特别的原因吗?

如果你真的想,你仍然可以使用mysqli,但我不能推荐它。