我使用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注入的东西。
建议表示赞赏。感谢
答案 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,这是计算中的常见做法。