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