【问题标题】:How to make wordpress safe from sql injection如何使wordpress免受sql注入
【发布时间】:2015-04-11 09:17:10
【问题描述】:

如何使以下代码免受 sql 注入的影响。

PHP 代码

 global $wpdb;

    if($wpdb->insert(
            'votes',
            array(
                    'votes' => $votes,
                    'competition' => $competition,
                    'uid' => $uid


                )
    ) == false) wp_die('Database Insertion failed'); else echo 'Database insertion successful<p />';

【问题讨论】:

  • 使用codex提供的prepared statement api
  • 好的,谢谢,对于所有类型的查询,如在 wordpress 中的插入、选择、更新和删除,准备好的语句都是必需的。因为我已经读过某个地方,我们可以不用它,以防插入查询。
  • @Ghost Bummer,insert() 实际上调用了prepare(),但是使用mysql(i)_real_escape_string() 转义了值,WordPress 中没有真正准备好的语句。
  • @jeroen 是的,这些包装类中的大多数都模拟准备好的语句,并且并没有真正发送查询将绑定的变量和语句分开,但是是的,这就是他们所拥有的,不妨使用 PDO 并起飞准备好的仿真

标签: php mysql wordpress


【解决方案1】:

wordpress insert 和 update 语句在内部使用 prepare 语句,因此无需从外部使用它们。 假设 $votes 整数和其他变量为字符串

全局 $wpdb;

if($wpdb->insert(
        'votes',
        array(
                'votes' => $votes,
                'competition' => $competition,
                'uid' => $uid
                 ),
        array(
              '%d',
              '%s',
              '%s',
            )
) == false) wp_die('Database Insertion failed'); else echo 'Database insertion successful<p />';

【讨论】:

  • 这听起来很合乎逻辑,但是您是否有任何参考文献可以证实这一点?
  • codepeach.com/wordpress/wordpress-database-interaction-wpdb insert() 方法如果插入行失败,则返回 false,但如果成功,它将新插入行的 AUTO_INCREMENT ID 存储在 $wpdb->insert_id 中。这里不需要调用 prepare() 方法,也不需要自己转义值,因为 insert() 方法会为我们做这些。
  • 可能只是吹毛求疵,但insert 在内部实际上调用了prepare,但使用mysql(i)_real_escape_string() 转义了值,在WordPress 中没有真正准备好的语句。
猜你喜欢
  • 2010-12-24
  • 2016-05-31
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2011-02-03
  • 2014-06-02
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多