mysqli_real_escape_string удаление значений - PullRequest
0 голосов
/ 02 июня 2018

Я получаю нулевые значения после запуска функции DBEscape ($ data), предназначенной для защиты от внедрения SQL.Может ли кто-нибудь помочь?

Все мои входные данные представляют собой несколько массивов, например: name = "quote [] [dt_flight]", name = "quote [] [acft]" и т. Д.

МетодПОСТ.

function DBEscape($data){
    $link = DBConect();
    if(!is_array($data)){
        $data = mysqli_real_escape_string($link,$data);
    }
    else {
        $arr = $data;
        foreach ($arr as $key => $value){
            $key = mysqli_real_escape_string($link, $key);
            $value = mysqli_real_escape_string($link, $value);
            $data[$key] = $value;
        }
    }
    DBClose($link);
    return $data;
}



    function DBCreate($table, array $data, $insertId = false){
        $table = DB_PREFIX.'_'.$table;
        $data = DBEscape($data);
        var_dump($data);
        $fields = implode(", ", array_keys($data));
        $values = "'".implode("', '", $data)."'";
        $query = "INSERT INTO {$table} ({$fields}) VALUES ({$values});";
        var_dump($query);
        return DBExecute($query, $insertId);
    }


if(isset($_POST["quote"]) && is_array($_POST["quote"])){
    foreach($_POST["quote"]["dt_flight"] as $key => $text_field){
        
        $last_id = DBCreate('quote',$_POST['quote'],true);
       
       $i++;
    }  
}

Соединение работает, поскольку оно вставляет строки в таблицы.Я использовал vardump до и после DBEscape, чтобы выяснить, что он удаляет значения, с ключами все в порядке.

PS: Предлагаемый ответ для одной переменной, а не массива.

1 Ответ

0 голосов
/ 07 июня 2018

Как вы можете видеть в своем var_dump -результате, данные, которые вы отправили на DBCreate и, следовательно, на DBEscape, выглядят как

array(
    'dt_flight' => array(0 => '2018-06-13'),
    'acft'      => array(0 => 'VQ-BFD',
    // and so on
)

Поэтому данные, отправленные вами на

// $value = array(0 => '2018-06-13') here
$value = mysqli_real_escape_string($link, $value);

И, конечно же, mysqli_real_escape_string не очень любит массивы, поэтому вернет NULL и, следовательно, вставит пустые данные в вашу таблицу.

Скорее всего, вы хотите устранить эту ошибку в вашейforeach($_POST["quote"]["dt_flight"]), поскольку я полагаю, что вы отправили несколько данных о рейсе:

foreach($_POST["quote"]["dt_flight"] as $key => $text_field) {
    // $key would be 0, for $_POST["quote"]["dt_flight"][0] = '2018-06-13'

    $keyData = [];
    foreach($_POST["quote"] as $field => $allFieldValues) {
        // Walk over every field, and add the value for the same $key
        if (is_array($data) && isset($allFieldValues[$key])) {
            // Would add for example $keyData['acft'] = $_POST['quote']['acft'][0] = 'VQ-BFD';
            $keyData[$field] = $allFieldValues[$key];
        }
    }

    var_dump($keyData); 
    // Would look like array(
    //    'dt-flight' => '2018-06-13',
    //    'acft'      => 'VQ-BFD',
    //    and so on
    // )

    $last_id = DBCreate('quote',$keyData,true);

    $i++;
}

Хотя это не является частью вашего вопроса, я действительно рекомендую вам также позаботиться о моем комментарии на ваш вопрос оmysqli_real_escape_string не является безопасным способом избежать имен столбцов (или имен таблиц и т. Д.).Например, со следующим решением:

function DBCreate($table, array $data, $insertId = false) {
    // For each table the known columns
    $columns = array( 'quote' => array('dt_flight', 'acft', '...') );

    // Verify valid table given
    if (!isset($columns[$table])) {
        throw new InvalidArgumentException('No such table: ' . $table);
    }

    // Remove everything from data where the key is not in $columns[$table] 
    // = Remove everything where the column-name is non-existing or even an attempt to hack your system
    $data = array_intersect_key($data, array_fill_keys($columns[$table], null));

    if (!count($data)) {
        throw new InvalidArgumentException('No (valid) data given at all');
    }

    // Next, continue with your implementation
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...