длина имени ключа $_POST?

#php #cakephp

#php #cakephp

Вопрос:

Я испытываю очень странное поведение. Допустим, у меня есть следующие два <input type='image'> src атрибутом, равным name атрибуту):

 <input type='image' name='http://farm1.static.flickr.com/224/471627793_fbda6cecbe_s.jpg'>
<input type='image' name='http://farm5.static.flickr.com/4053/4501238330_c5a85162ef_s.jpg'>
  

Мой вопрос: почему первый ввод отправляется, а второй нет? Я использую CakePHP, и если я нажму на второе изображение, $this->params['form'] оно будет пустым. Но когда я нажимаю на первое изображение, все работает нормально: $this->params['form'] содержит правильное название изображения вместе с его координатами, откуда на него был сделан щелчок.

Это очень странное поведение, и я считаю, что это может произойти, только если $_POST ограничить длину его ключей.

Любая помощь высоко ценится! Спасибо!

Комментарии:

1. У вас установлен патч Suhosin?

2. Вы пробовали какие-то другие комбинации полей. Например: 1: Просто используйте одно поле <ввода> со вторым ключом. 2. Удалите второе поле ввода и постепенно увеличивайте длину имени.

3. Данные POST отправляются в теле запроса в виде пар ключ = значение. Таким образом, не существует неотъемлемого ограничения ни на длину ключа, ни на длину значения.

4. @N.B.: Нет, у меня не установлен этот патч. @Scobal: Я тестировал, и если длина ключа превышает 62 символа, он не отправляется. Но почему такое странное поведение?

5. @N.B.: Извините, только что узнал, что у меня установлен этот патч. Как я могу перезаписать настройки по умолчанию, учитывая, что я нахожусь на платном хостинге?

Ответ №1:

Сам PHP не ограничивает длину имени поля для multipart/ или -urlencoded запросов POST.

Но у suhosin действительно естьhttp://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_name_length с значением по умолчанию 64 . И ваш второй URL действительно имеет длину 64 символа.

Менее вероятной, но также возможной является настройка mod_security. Однако это привело бы к появлению сообщения об ошибке, а не к усечению.

Комментарии:

1. Как мне узнать, установлен ли suhosin? Также где мне следует искать настройку mod_security? Я тестировал с другой случайно сгенерированной строкой, и она делает то же самое. Если имя превышает 62 символа (64 с добавленными _x и _y), кнопка не отправляет.

2. Хорошо, я только что узнал, что у меня есть патч Suhosin. Есть ли какой-нибудь способ перезаписать значения по умолчанию? Обратите внимание, что я нахожусь на платном хостинге.

3. Что ж, если вы платите за свой хостинг, вы имеете право связаться с администратором и попросить внести изменения на стороне системы. Обычные настройки могут быть переопределены через php_value in .htaccess . Но сухосин, похоже, ограничен чтением их только из центрального php.ini . Если он установлен у вашего хостера, скорее всего, он использует suexec, и у вас есть пользовательский php.ini для каждой учетной записи, который они могут изменить для вас.

4. Вы верно подметили, но в качестве временного решения я создал пользовательский атрибут name, содержащий только параметр из URL-адреса Flickr, который мне действительно нужен (идентификатор, сервер, ферма и секрет). Но как только у меня будет необходимое время, я поговорю со своим администратором.

5. Не говори мне. Я постоянно внедряю обходные пути для mod_security, потому что моему хостеру требуется день, прежде чем внедрять исправления конфигурации.

Ответ №2:

Я не уверен, что это связано с длиной, согласно w3.org:

Маркеры идентификатора и ИМЕНИ должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисов («-«), подчеркиваний («_»), двоеточий («:») и точек («.»).

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

Вы пробовали это в разных браузерах?

Комментарии:

1. Нет. Так может ли шаблон URL атрибута name быть ошибкой? Это странно, потому что, если в нем меньше 62 символов, кнопка отправляется, независимо от того, содержит ли она URL.

2. Ошибаюсь ли я, думая, что атрибут value отправлен для кнопок изображения? Это было бы гораздо лучшей идеей, чем использовать «name» для передачи данных, предполагая, что это работает.

3. Нет, атрибут name отправляется вместе с координатами места, где пользователь нажал на кнопку.

4. @link ах, совершенно верно. Я пытался прочитать спецификацию ввода [type =image], которая не очень четко описывает поведение.