Волшебная цитата и mysql_real_escape_string - PullRequest
0 голосов
/ 09 ноября 2011

Вот оригинальный код:

       if (($handle = fopen($source_file, "r")) !== FALSE) {
    $columns = fgetcsv($handle, $max_line_length, ",");
    foreach ($columns as &$column) {
        $column = str_replace(".","",$column);
    }
    while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
        while(count($data) < count($columns)) {
            array_push($data, NULL);
        }
        $c = count($data);
        for($i = 0; $i < $c; $i++) {
            $data[$i] = "'{$data[$i]}'";
        }

        $sql[] = '(' . implode(',', $data) . ", '" . $_POST['custgroup'] . "'," . $_POST['user_id'] . ')';
    }


$query = "INSERT INTO $target_table (" . implode(',', $columns) . 
      ',custgroup,user_id) VALUES ' . implode(',', $sql);


    //mysql_query($query) or trigger_error(mysql_error());
    echo $query;
    fclose($handle);
}

Но однажды я добавил mysql_real_escape_string:

   $query = "INSERT INTO $target_table (" . implode(',',array_map('mysql_real_escape_string', $columns)) . 
          ',custgroup,user_id) VALUES ' . implode(',',array_map('mysql_real_escape_string', $sql));

Запрос станет:

INSERT INTO UserAddedRecord (lastname,firstname,ceLL,fax,email,code,custgroup,user_id) VALUES (\'Last\',\'First\',\'01122331\',\'\',\'abc@hotmail.com\',\'12345\', \'\',17)

Я проверил свой php.ini и get_magic_quotes_gpc (), магическая цитата отключена.

magic_quotes_gpc = Off

magic_quotes_runtime = Off

magic_quotes_sybase = Off

В чем должна быть проблема? Или я должен просто применить stripslashes ()? Но я предполагаю, что он будет использоваться только когда включена магическая кавычка.

1 Ответ

3 голосов
/ 09 ноября 2011

Вы должны что-то вроде:

  • использовать mysql_real_escape_string для всех строковых значений
  • приведите все интертеры к (int)
  • после , к которым применяются одинарные кавычки (')

Смысл mysql_real_escape_string состоит в том, чтобы экранировать специальные символы в тестовом содержимом, поэтому использование полосных косых черт уберет это.

Еще один способ решить эту проблему - заглянуть в preparedStatements, где вам не нужно отступать на стороне клиента.

Просто помните, что весь смысл этого состоит в том, чтобы предотвратить SQL-инъекцию и действовать соответственно:)

...