保护我的zend_db_select插入语句

时间:2013-06-29 11:02:17

标签: php zend-framework zend-db zend-db-select

我使用zend_db_select类作为我的sql包装器。我想知道以下插入语句是否安全。 (是否提供防止sql注入的机制等)

function createNew($message,$tags,$userid,$imgsrc){
    $data = array('message' => $message,
                      'tags' => $tags,
                      'imgsrc' => $imgsrc,
                      'createdtimestamp'=>new Zend_Db_Expr('NOW()'),
                      'userid' => $userid);   
    $this->dbo->insert('data', $data);
    return $this->dbo->lastInsertId();
}

我尝试用一​​些引号在表格中插入一行,并且它没有用\来逃脱,我是否担心太多或者phpmyadmin自动删除\以便于查看?困惑。我在某处读到zend_db_select适合像这样的sql注入的东西。

建议表示赞赏。感谢

1 个答案:

答案 0 :(得分:2)

是的,这是安全的。 Zend DB使用prepared statements,因此使用适当的机制自动转义数组的每个值。

如果您查看数据库的内容(例如使用像phpMyAdmin这样的工具),您应该永远不会看到转义中的引号,这是转义数据的重点。如果您插入字符串O'Reilly,那就是数据库中的结果。

修改:请考虑以下问题:

INSERT INTO users (name) VALUES ('John O'Reilly')

这将无效并且会给您一个SQL语法错误,因为SQL解析器会看到第二个'作为列值的结尾,然后在看到后面的字符时会窒息。所以你逃脱了这个引用:

INSERT INTO users (name) VALUES ('John O\'Reilly')

反斜杠告诉它将下面的撇号视为文字(即不要将其视为列值的结尾)。 反斜杠本身永远不会插入数据库This is an escape character,这是计算中的常见做法。