parse_str случайным образом добавляет точки с запятой

Я передаю строку запроса как часть строки запроса в PHP-скрипт.

Своего рода:

$.post('/url', { id: postID filters: $('#form').serialize() }); 

Затем в моем PHP я использую parse_str для чтения filters :

 <?php $postID = $this->input->post('id'); parse_str($this->input->post('filters'), $filters); 

Проблема в том, что parse_str добавляет ; s случайным образом к ключам. Я получаю такой результат:

 array(4) { ["users"]=> string(0) "" ["companies;"]=> string(0) "" ["pref;_123"]=> string(0) "" ["products;"]=> array(2) { [0]=> string(4) "1234" [1]=> string(4) "5678" } } 

Почему добавляется сервер ; ? Я попробовал это на другом сервере, и этого не происходит. Это также не происходит при тестировании через CLI.

EDIT : Кажется, это не parse_str , а какой-то фильтр XSS. $this->input->post('filters') (и даже $_POST['filters'] !) содержит ; персонажи. Я проверил, и jQuery не добавляет их.

EDIT : мне удалось «исправить» это, выполнив:

 $filters = array_combine(array_map(function($x){ return str_replace(';', '', $x); }, array_keys($filters)), array_values($filters)); 

Это вызвано переменной конфигурации global_xss_filtering в Codeigniter. Установите для него значение false, чтобы отключить это поведение.

Смотрите также:
xss_clean добавляет точку с запятой ко всему,
CodeIgniter добавляет точки с запятой

Я бы сначала сделал var_dump из $ filters, чтобы увидеть, что входит.

parse_str будет анализировать строку, которую вы отправляете так:

 $string = "user=&companies=StackOverflow"; parse_str($string, $filters); echo $filters['user']; // empty string echo $filters['companies']; // StackOverflow 

Мое лучшее предположение заключается в том, что то, что отправляется из сериализации iQuery (включая данные), неправильно сериализовано / экранировано, вероятно, поэтому parse_str может легко разбить строку с помощью & как разделителя для ключа / значения каждого параметра.

Читая руководства, вы, безусловно, делаете что-то правильно, но в ваших данных может быть что-то скрывающее, что выкидывает parse_str. Я также искал бы незаконных символов в sting, отправленных jQuery.