parserALT
Страницы форума: ← Назад | 1 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 600 | Дальше →

Портятся запощенные данные

#1zobzn
21.05.10 17:31
www.parser.ru → | ответить → | в избранное →

Портятся запощенные данные

Есть форма с <textarea name="smp"></textarea>.
При отправке формы в обработчик приходят искореженные данные. Причем данные корежатся в какой-то зависимости от пробельных символов в самих данных.

Например.

Случай 1
Отправляю этот текст (с табуляциями в начале строк):
<form name="authorisation">
	<dl>
		<dt>submit</dt><dd>valid</dd><dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
		<dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

	<label>Пароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password" />
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не&nbsp;помню</a></dd>
	</dl>

	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt><dd>checkbox</dd>
	</dl>

	<label>&nbsp;</label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58" /></div>

</form>


В $form:smp попадают обрезанные данные:
<form name="authorisation">
	<dl>
		<dt>submit</dt><dd>valid</dd><dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
		<dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>


Случай 2
Отправляю такое (табуляции плюс кое-где пробелы):
<form name="authorisation">
   
	<dl>
		<dt>submit</dt> <dd>valid</dd> <dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
	    <dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

	<label>Пароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password"/>
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не&nbsp;помню</a></dd>
	</dl>


	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt>
		<dd>checkbox</dd>
	</dl>

	<label>&nbsp;</label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58"/></div>

</form>


Получаю такое:
<form name="authorisation">
   
	<dl>
		<dt>submit</dt> <dd>valid</dd> <dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
div>"></div>"></div>"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
	    <dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

</label>Пароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password"/>
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не&nbsp;помню</a></dd>
	</dl>


	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt>
		<dd>checkbox</dd>
	</dl>

	<label>&nbsp;</label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58"/></div>

</form>


т.е. <div class="errors"></div> заменился на такую гадость div>"></div>"></div>"></div>, а <label>Пароль</label> заменился на </label>Пароль</label>

С чем это все может быть связано? Как побороть?
ОС: Ubuntu 10.04, 32-битная.
Парсер: 3.4.0.
Парсерный скрипт пробовал и из убунтовского репозитария и с этого сайта (parser3_4_0_debian5_cgi_xml.tar.gz).
#2Misha v.3
→ zobzn [#1] | 22.05.10 02:55
www.parser.ru → | ответить → | в избранное →

пока никаких идей нет

для начала попробуйте упростить код, например до такого:
^if(def $form:text){
	^form:text.save[/../temp/form.txt]
}{
	<form method="post">
		<textarea name="text"></textarea>
		<input type="submit" name="do" value="Send" />
	</form>
}

и посмотрите, происходит-ли искажение данных.
#3zobzn
→ Misha v.3 [#2] | 22.05.10 21:39
www.parser.ru → | ответить → | в избранное →

без изменений

Явно в $form:text попадает не то, что должно бы.
Файрбаг показывает что скрипту отправляется то, что нужно. А вот в серверной стороне уже бяка.

Если в указанных данных в начале строк табуляцию заменяю на пробелы, то приходит нормально без искажений. Если табуляции или сочетание табуляций и пробелов, то все также приходят или покореженные или обрезанные данные, или и то и другое вместе.
#4zobzn
→ Misha v.3 [#2] | 22.05.10 22:05
www.parser.ru → | ответить → | в избранное →

в некоторых случаях еще и символы портятся

отправил это
<form name="authorisation">
	<dl>
		<dt>submit</dt> <dd>valid</dd> <dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
		<dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

	<label>Пароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password"/>
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не помню</a></dd>
	</dl>


	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt>
		<dd>checkbox</dd>
	</dl>

	<label> </label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58"/></div>

</form>


получил это
<form name="authorisation">
	<dl>
		<dt>submit</dt> <dd>valid</dd> <dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
		<dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

&#65533;</label>&#65533;ароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password"/>
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не помню</a></dd>
	</dl>


	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt>
		<dd>checkbox</dd>
	</dl>

	<label> </label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58"/></div>

</form>


Испортились символы в слове "Пароль" и перед ним.
Файл в utf08, в auto.p:
$request:charset[UTF-8]
$response:charset[UTF-8]
$response:content-type[
	$.value[text/html]
	$.charset[$response:charset]
]


Даже догадок нет, что за полтергейст творится.
#5MoKo
→ zobzn [#3] | 23.05.10 00:56
www.parser.ru → | ответить → | в избранное →

Список модулей apache?

#6zobzn
→ MoKo [#5] | 23.05.10 13:29
www.parser.ru → | ответить → | в избранное →
/usr/lib/apache2/modules/mod_actions.so
/usr/lib/apache2/modules/mod_alias.so
/usr/lib/apache2/modules/mod_auth_basic.so
/usr/lib/apache2/modules/mod_authn_file.so
/usr/lib/apache2/modules/mod_authz_default.so
/usr/lib/apache2/modules/mod_authz_groupfile.so
/usr/lib/apache2/modules/mod_authz_host.so
/usr/lib/apache2/modules/mod_authz_user.so
/usr/lib/apache2/modules/mod_autoindex.so
/usr/lib/apache2/modules/mod_cgi.so
/usr/lib/apache2/modules/mod_deflate.so
/usr/lib/apache2/modules/mod_dir.so
/usr/lib/apache2/modules/mod_env.so
/usr/lib/apache2/modules/mod_mime.so
/usr/lib/apache2/modules/mod_negotiation.so
/usr/lib/apache2/modules/libphp5.so
/usr/lib/apache2/modules/mod_reqtimeout.so
/usr/lib/apache2/modules/mod_rewrite.so
/usr/lib/apache2/modules/mod_setenvif.so
/usr/lib/apache2/modules/mod_ssl.so
/usr/lib/apache2/modules/mod_status.so
/usr/lib/apache2/modules/mod_vhost_alias.so
#7MoKo
→ zobzn [#6] | 25.05.10 06:40
www.parser.ru → | ответить → | в избранное →

Странно все это

Из модулей меня смущает только deflate (если он включен).

Можно попробовать у формы (надеюсь метод там указан POST, а не GET) добавить enctype="multipart/form-data".

Опять же точный парсерный код (в идеале не фрагмент кода, а полноценный test.html) сильно бы упростил задачу.
#8zobzn
→ MoKo [#7] | 25.05.10 13:01
www.parser.ru → | ответить → | в избранное →
Вот полный текст испытуемого файла.

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>

	^if(def $form:text){
		^form:text.save[form.txt]
	}

	<form method="post" enctype="multipart/form-data">
		<p><textarea name="text" cols="120" rows="30">^taint[as-is][$form:text]</textarea></p>
		<p><input type="submit" name="do" value="Send"></p>
	</form>

</body></html>


Смена method=get/post ошибку не исправляет. enctype ошибку не исправляет.
Раньше думал, что если табуляции заменить на пробелы, то исправляется, оказывается что и это не исправляет.
#9Misha v.3
→ zobzn [#8] | 25.05.10 13:27
www.parser.ru → | ответить → | в избранное →
уточните, плиз, версию OS (32/64bit?), web сервера и parser(32/64bit? cgi/module?).

мне кажется, что проблема не в парсере, а в web сервере. предлагаю попробовать это проверить.

вариант 1:
^if(def $form:text){
	^request:body.save[/../temp/request.txt]
}


вариант 2 (если можете попробовать собрать парсер сами):
в parser3.C в SAPI::read_post в конце можно попробовать или записать считанное у веб сервера в файл или тупо throw его.

вариант 3 (вообще исключаем parser):
в качестве action указать какой-нить action.pl, в котором принять данные и сохранить в файл.
#10moko
→ Misha v.3 [#9] | 25.05.10 17:33
www.parser.ru → | ответить → | в избранное →

Про OS он писал в начальном топике

ОС: Ubuntu 10.04, 32-битная.
Парсер: 3.4.0.
Парсерный скрипт пробовал и из убунтовского репозитария и с этого сайта (parser3_4_0_debian5_cgi_xml.tar.gz).


2zobzn: а если UTF-8 поменять на Windows-1251?
И какие кодировки заданы у парсера в cgi/auto.p?
#11zobzn
→ Misha v.3 [#9] | 25.05.10 17:54
www.parser.ru → | ответить → | в избранное →
Ubuntu 10.04 32bit
Apache/2.2.14
Parser/3.4.0 (compiled on i686-pc-linux-gnu)

вариант 1: в $request:body все красиво без искажений
------WebKitFormBoundaryuzilcriRAD6bB6qz
Content-Disposition: form-data; name="text"

<form name="authorisation">
	<dl>
		<dt>submit</dt><dd>valid</dd><dd>changed</dd>
	</dl>

	<div>
		<h3>Вход</h3>
		<div class="errors"></div>
	</div>

	<input name="auth.logon" type="hidden" value="do" />

	<label>Логин</label>
	<input name="auth.name" id="auth_name" type="login" />
	<dl>
		<dt>valid</dt><dd>/^[A-Za-z0-9\_\-]+$/</dd>
		<dt>required</dt>
	</dl>

	<label>Пароль</label>
	<input name="auth.passwd" id="auth_passwd" type="password" />
	<dl>
		<dt>required</dt>
		<dt>example</dt><dd><a object-id="59">Не&nbsp;помню</a></dd>
	</dl>

	<select name="auth.persistent">
		<option value="1" checked="true">запомнить меня</option>
	</select>
	<dl>
		<dt>type</dt><dd>checkbox</dd>
	</dl>

	<label>&nbsp;</label>	
	<input type="submit" id="sub_form" value="Войти" />

	<div class="switcher_link"><a id="registaration-link" object-id="58" /></div>

</form>
------WebKitFormBoundaryuzilcriRAD6bB6qz
Content-Disposition: form-data; name="do"

Send
------WebKitFormBoundaryuzilcriRAD6bB6qz--


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

вариант 3: перла не знаю. аналогичный скрипт на php в $_REQUEST['text'] получает все без искажений.
#12zobzn
→ moko [#10] | 25.05.10 17:59
www.parser.ru → | ответить → | в избранное →
Уже писал, все в utf-8 - и в auto.p и все .html файлы.
Перекодировка в windows-1251 ничего не поменяла.
В $request:body все ок, в $form:text - искажения.
#13Misha v.3
→ zobzn [#12] | 25.05.10 18:16 / 18:23
www.parser.ru → | ответить → | в избранное →
в $request:body все OK -- значит от веб сервера данные нормально получены.

в некоторых местах у вас символы преобразуются в &#xxxxx;. я вижу только одно место в парсерном коде, где такое преобразование может произойти -- в transcode из utf-8 в однобайтную кодировку (напр. 1251). но transcode начинает работать только если кодировки не совпадают. как такое может быть в вашем случае -- я не очень понимаю.

предлагаю ещё немного поковыряться с тестовым файлом:
@main[]
<html>
<body>
	^$request:charset: '$request:charset'<br />
	^$request:post-charset: '$request:post-charset'<br />
	^$response:charset: '$response:charset'<br />
	^$response:content-type.charset: '$response:content-type.charset'<br />

	<form method="post" enctype="multipart/form-data">
		<p><textarea name="text" cols="120" rows="30">^taint[html][$form:text]</textarea></p>
		<p><input type="submit" name="do" value="Send"></p>
	</form>

</body>
</html>

@postprocess[body]
$result[$body]


да, и ради смеха попробуйте другим браузером.
#14zobzn
→ Misha v.3 [#13] | 25.05.10 18:50
www.parser.ru → | ответить → | в избранное →
Не, испорченный символ не в виде ентити, а как какой-то битый символ показывается. Он заменился на ентити при вставке в сообщения на этот форум. Вот как это выглядит в браузере
http://habreffect.ru/files/5c4/4740874d0/screen.png
И плюс на скрине результат вывода кодировок.
В разных браузерах результат одинаковый.
#15Ышлщя
→ zobzn [#1] | 25.05.10 21:19
www.parser.ru → | ответить → | в избранное →

У меня подобное было в большой multipart-форме

Причину не нашел. Убрал multipart и файловое поле - баг ушел.
#16Misha v.3
→ zobzn [#14] | 26.05.10 05:31 / 05:31
www.parser.ru → | ответить → | в избранное →

шаманство какое-то

попробуйте переименовать все auto.p (например в "auto.p-"), чтобы для этого тестового файла не выполнялось вообще ничего, кроме него самого.

если кодировка не задана, то это равносильно UTF-8, но, чтобы браузер нормально показал страницу, укажите в приведённом ранее @postprocess (в тестовом файле):
$response:content-type[
	$.value[text/html]
	$.charset[UTF-8]
]


ещё, если возможно, покажите результаты HEAD запроса к этой тестовой странице (без post) например из telnet-а (вдруг тут что-нить необычное будет видно):
telnet zbz 80<enter>
HEAD / HTTP/1.1<enter>
Host: zbz<два раза enter>
#17zobzn
→ Misha v.3 [#16] | 26.05.10 12:31
www.parser.ru → | ответить → | в избранное →
Все auto.p переименовал, в @postprocess $response:content-type добавил.
Единственное, что изменилось - $response:content-type.charset теперь '' вместо 'UTF-8'. Ошибки остались.

nc zbz 80 выдает:
HTTP/1.1 200 OK
Date: Wed, 26 May 2010 08:30:58 GMT
Server: Apache/2.2.14 (Ubuntu)
Content-Length: 418
Connection: close
Content-Type: text/html; charset=UTF-8
#18Misha v.3
→ zobzn [#17] | 26.05.10 15:53
www.parser.ru → | ответить → | в избранное →
у меня иссякли варианты.

предлагаю попробовать собрать бинарник самому. возможно это не доставит проблем. надо скачать исходники, распаковать их как написано в доке и запустить ./buildall-with-xml
#19moko
→ Misha v.3 [#18] | 26.05.10 16:46
www.parser.ru → | ответить → | в избранное →

Сомневаюсь...

Что-то сомневаюсь, что самостоятельная сборка бинарника может чему-то помочь. :)

2zobzn: Если после этого:

^form:text.save[form.txt]
^request:body.save[request.txt]

В request.txt все OK, а в form.txt - битые данные, то это действительно полная мистика. У меня проблема не повторяется. Что может быть у вас - сложно сказать, возможности удаленной диагностики исчерпаны. Так что боюсь только при наличии ssh доступа можно будет в отладчике посмотреть, что именно идет не так.
#20zobzn
→ moko [#19] | 26.05.10 17:03
www.parser.ru → | ответить → | в избранное →
Наверно завтра все-таки прийдется попробовать собрать бинарник у себя. И тогда если не исправится, попробую организовать ssh доступ.
#21zobzn
→ moko [#19] | 28.05.10 15:21
www.parser.ru → | ответить → | в избранное →
Сборка парсера не помогла. Ни 3.4.0 ни HEAD версия. Все равно те же самые битые данные.
Тогда к следующей неделе попробую организовать ssh доступ. Мне нужно еще что-то дополнительно установить, что может понадобиться при дебаге?
#22MoKo
→ zobzn [#21] | 31.05.10 01:19
www.parser.ru → | ответить → | в избранное →

gdb

Кроме gdb скорее всего ничего не потребуется. :)
Доступ слать на moko@moko.ru.
#23moko
→ MoKo [#22] | 01.06.10 17:37
www.parser.ru → | ответить → | в избранное →

9 лет висело ружье на стене (судя по CVS с 1.72 от 16-Oct-01)

Проблема есть, есть и решение. Интересно, что вылезло это только на конкретной конфигурации - получается во всех остальных системных библиотеках используется реализация memcpy, которой не принциально пересечение областей. Но потенциально может вылезти где угодно и когда угодно. :( На остальные memcpy в коде тоже посмотрим.

man memcpy:


The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.


>cvs diff -u pa_common.C
Index: pa_common.C
===================================================================
RCS file: /parser3project/parser3/src/main/pa_common.C,v
retrieving revision 1.259
diff -u -r1.259 pa_common.C
--- pa_common.C 25 May 2010 09:30:30 -0000 1.259
+++ pa_common.C 1 Jun 2010 13:18:16 -0000
@@ -102,7 +102,7 @@
while(char* eol=(char*)memchr(bol, '\r', eob -bol)) {
size_t len=eol-bol;
if(dest!=bol)
- memcpy(dest, bol, len);
+ memmove(dest, bol, len);
dest+=len;
*dest++='\n';

@@ -114,7 +114,7 @@
}
// last piece without \r
if(dest!=bol)
- memcpy(dest, bol, eob-bol);
+ memmove(dest, bol, eob-bol);
str[length]=0; // terminating
}

P.S. Вызов fix_line_breaks идет из VForm::AppendFormEntry.
#24zobzn
→ moko [#23] | 01.06.10 18:06
www.parser.ru → | ответить → | в избранное →
После патча вроде все исправилось. Больше проблем не встречал.
Всем большое спасибо за помощь.
Страницы форума: ← Назад | 1 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 600 | Дальше →