繁体   English   中英

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

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

我必须处理大型mysql DB。 具有大量计算(在select子句中)和where子句中几种条件的sql查询。 因此,我决定通过$db = ConnectionManager::getDataSource('default');使用行/直接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,但我不推荐使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM