【问题标题】:Securing my zend_db_select insert statement保护我的 zend_db_select 插入语句
【发布时间】:2013-06-29 11:02:16
【问题描述】:

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

建议赞赏。谢谢

【问题讨论】:

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


    【解决方案1】:

    是的,这是安全的。 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,这是计算中的常见做法。

    【讨论】:

    • 嗨蒂姆!谢谢回复!不明白为什么我们永远不应该看到转义的引号,这是为什么?转义数据的重点是在数据库中查看我们的字符串 get \'。例如,我们输入了 O'Reilly,如果字符串在数据库中显示为 O'Reilly,我们怎么知道它被转义了。我对这一点感到困惑。
    • 我已经编辑了我的答案以包含一个示例 - 希望这更清楚。
    • oic!我刚刚意识到...所以 sql 注入只能发生在带有 where 子句的 select、delete 和 update 语句中?插入不会发生这种情况?
    • 不,任何涉及用户输入的查询都可能发生 SQL 注入
    • hmm,那么上面的insert语句会发生sql注入吗?它是如何保护的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多