Я передаю строку запроса как часть строки запроса в 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.