Почему POST обрезает параметр, представленный в виде URL?

Здравствуйте.
Использую CodeIgniter 2
Пытаюсь сохранить в бд url страницы. Но не совсеми прокатывает. Например длинные ссылки googla сохраняет на ура, а ссылки на сайты joomla обрезает.

Вот пример:
Сохраняю параметры с формы
<form id="main_form" accept-charset="utf-8" method="post" action="http://my_site/index.php/pages/row_edit/tbl_contacts/70/218">

Один из параметров url.
http://www.site.ru/index.php?option=com_content&view=article&id=456%3A2013-09-10-13-37-27&catid=31%3A2013-09-10-13-31-23&Itemid=33

Записываю его в контрол и отправляю на сервер при помощи метода $.post jQuery
В инспекторе параметр отображается нормально. Строка которая отправляется на сервер выглядит так:
id=70&page_id=218&url=http%3A%2F%2Fwww.site.ru%2Findex.php%3Foption%3Dcom_content%26view%3Darticle%26id%3D456%253A2013-09-10-13-37-27%26catid%3D31%253A2013-09-10-13-31-23%26Itemid%3D33

но при выводе print_f($_POST) параметр url обрезается на
Array
(
    [id] => 70
    [page_id] => 218
    [url] => http //www.site.ru/index.php?opti
)


Прошу помощи у сообщества.

В конечном итоге разобрался.

Оказывается у CI 2 есть такой метод xss_clean, который участвует в валидации, так вот там проверяется следующее
protected function _remove_evil_attributes($str, $is_image)
	{
		// All javascript event handlers (e.g. onload, onclick, onmouseover), style, and xmlns
		$evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction');

		if ($is_image === TRUE)
		{
			/*
			 * Adobe Photoshop puts XML metadata into JFIF images, 
			 * including namespacing, so we have to allow this for images.
			 */
			unset($evil_attributes[array_search('xmlns', $evil_attributes)]);
		}

		do {
			$count = 0;
			$attribs = array();

			// find occurrences of illegal attribute strings with quotes (042 and 047 are octal quotes)
			preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is', $str, $matches, PREG_SET_ORDER);

			foreach ($matches as $attr)
			{
				$attribs[] = preg_quote($attr[0], '/');
			}

			// find occurrences of illegal attribute strings without quotes
			preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*([^\s>]*)/is', $str, $matches, PREG_SET_ORDER);

			foreach ($matches as $attr)
			{
				$attribs[] = preg_quote($attr[0], '/');
			}

			// replace illegal attribute strings that are inside an html tag
			if (count($attribs) > 0)
			{
				$str = preg_replace('/(<?)(\/?[^><]+?)([^A-Za-z<>\-])(.*?)('.implode('|', $attribs).')(.*?)([\s><]?)([><]*)/i', '$1$2 $4$6$7$8', $str, -1, $count);
			}

		} while ($count);

		return $str;
	}


т.е. вырезаются все Javascript, css и xmlns
вот тут то и проверяется наличие этого "on"

Всем спасибо
  • Вопрос задан
  • 4411 просмотров
Решения вопроса 1
@blormik Автор вопроса
Спасибо за ответы. На клиенте все нормально, оказывается codeigniter как то меняет массив $_POST после валидации. Буду разбираться
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mlnkv
@mlnkv
JavaScript Developer
перед отправкой
var url = "http://www.site.ru/index.php?option=com_content&view=article&id=456%3A2013-09-10-13-37-27&catid=31%3A2013-09-10-13-31-23&Itemid=33";
var escapeUrl = encodeURIComponent(url);
$.post('my_server.php', {url: escapeUrl}, callback);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы