WordPress上的SQL注入攻击



正在为wordpress构建自己的个人插件。

使用下面的代码,我可以通过wordpress查询记录并将其插入数据库。 使用下面的代码,我知道它容易受到SQL注入攻击。

我知道如何通过PDO和Mysqli防止注入,但我担心wordpress。WordPress是否使用预准备语句。

有人可以告诉我如何使用下面的代码防止WordPress中的SQL注入攻击。

global $wpdb;
// Add record
if(isset($_POST['submit'])){
    $name = $_POST['txt_name'];
    $uname = $_POST['txt_uname'];
    $email = $_POST['txt_email'];
    $tablename = $wpdb->prefix."myplugin";
    if($name != '' && $uname != '' && $email != ''){
        $check_data = $wpdb->get_results("SELECT * FROM ".$tablename." WHERE username='".$uname."' ");
        if(count($check_data) == 0){
            $insert_sql = "INSERT INTO ".$tablename."(name,username,email) values('".$name."','".$uname."','".$email."') ";
            $wpdb->query($insert_sql);
            echo "Save sucessfully.";
        }
    }
}

Wordpress 确实支持使用 $wpdb->prepare(( 的预准备语句(也称为参数化查询(。

global $wpdb;
// Add record
if(isset($_POST['submit'])){
    $name = $_POST['txt_name'];
    $uname = $_POST['txt_uname'];
    $email = $_POST['txt_email'];
    $tablename = $wpdb->prefix."myplugin";
    if($name != '' && $uname != '' && $email != ''){
        $check_data = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$tablename} WHERE username = %s ;"
            , [$uname]
        ));
        if(count($check_data) == 0){
            $insert_sql = $wpdb->prepare(
                "INSERT INTO {$tablename}(name,username,email) values(%s, %s, %s) ;"
                , [$name, $uname, $email]
            );
            $wpdb->query($insert_sql);
            echo "Save sucessfully.";
        }
    }
}

需要注意的两件事:

  • 在这种情况下,所有参数都是字符串,因此被 %s 替换,但您也可以使用 %d 表示整数,%f 表示浮点数,就像在 PHP sprintf(( 中一样。
  • 不需要在字符串占位符 ( %s ( 两边添加引号。$wpdb->prepare()方法可以解决这个问题。

最新更新