你如何逃避CakePHP中的SQL数据?

时间:2010-08-20 19:33:38

标签: php orm cakephp

由于某种原因,AppModel->updateAll()方法不会转义传递给它的数据。但是查看文档,我找不到任何关于如何使用CakePHP实际转义数据的内容。

向下datasources/dbo/dbo_mysql.php我找到了似乎只使用value()的{​​{1}}方法 - 但是如何在模型中从上方访问该方法?

3 个答案:

答案 0 :(得分:9)

对于大多数的CakePHP模型函数,您不必担心转义输入。

  

CakePHP已经保护你免受攻击   如果您使用SQL注入:

     
      
  1. CakePHP的ORM   方法(例如find()save())加上:
  2.   
  3. 正确的数组符号(即。   array('field' => $value))代替   原始SQL。
  4.         

    对XSS进行消毒   它通常更好地保存原始HTML   在数据库中没有修改和   在当时消毒   输出/显示。

         

    参见https://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html   但是,在您需要运行自定义SQL查询或子查询时,还有其他情况。在这些情况下,您可以:

使用准备好的陈述

$db->fetchAll(
    'SELECT * from users where username = :username AND password = :password',
    ['username' => 'jhon','password' => '12345']
);

使用Model->getDataSource()->value()

自定义转义
$sql = 'SELECT * FROM table WHERE name = ' 
     . $this->MyModel->getDataSource()->value($untrustedInput, 'string') . ';'

value()函数基本上会转义并添加如下引号:

"'" . mysql_real_escape_string($data, $this->MyModel->getDataSource()->connection) . "'"

消毒等级

使用作为选项,但自CakePHP 2.4起已弃用。

答案 1 :(得分:2)

$name = "somename";

$db = $this->getDataSource();
$this->Model->query('SELECT * FROM models WHERE name = '.$db->value($name, 'string') . ';');

CakePHP还关注引用您的输入,因为它被标记为字符串。

SELECT * FROM models WHERE name = "somename";

答案 2 :(得分:-1)

这是另一种做事方式,使用Sanitize :: paranoid:

http://www.ibm.com/developerworks/opensource/library/os-php-cake3/