SQL-инъекция на WordPress - PullRequest
0 голосов
/ 09 июня 2019

Создаю свой собственный плагин для WordPress.

С кодом ниже, я могу запросить и вставить запись в базу данных через WordPress. С кодом ниже, я знаю, что уязвим для атаки SQL инъекций.

Я знаю, как предотвратить инъекцию через PDO и Mysqli, но меня беспокоит WordPress. Использует ли WordPress подготовленное утверждение.

Может кто-нибудь показать мне, как предотвратить атаки SQL инъекций в WordPress с кодом ниже.

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.";
        }
    }
}

1 Ответ

0 голосов
/ 09 июня 2019

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().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...