0

我使用 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 注入。

建议表示赞赏。谢谢

4

1 回答 1

2

是的,这是安全的。Zend DB 使用准备好的语句,因此您的数组的每个值都会使用适当的机制自动转义。

如果您查看数据库的内容(例如使用 phpMyAdmin 之类的工具),您应该永远不会在其中看到转义的引号,这就是转义数据的重点。如果您插入 string O'Reilly,这就是您的数据库中的内容。

编辑:考虑这个查询:

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

这不起作用并且会给你一个 SQL 语法错误,因为 SQL 解析器会将第二个'视为列值的结尾,然后当它看到后面的字符时会窒息。所以你逃避需要逃避那句话:

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

反斜杠告诉它将后面的撇号视为文字(即不要将其视为列值的结尾)。反斜杠本身永远不会插入到数据库中。这是一个转义字符,这是计算中的常见做法。

于 2013-06-29T14:15:41.443 回答