Регистрация
Регистрируясь, вы подтверждаете свое согласие с соглашением об использовании персональных данных.
Восстановление пароля

[BUG] Некорректная работа обмена данными с 1С при наличии SSL сертификата на сайте

17.12.2018, 21:42
Алексей
Алексей Царапкин
Алексей

Зарегистрирован:
2011-11-16
Сообщений: 32

Не понимаю как это не всплыло раньше, но вот что обнаружил.
Долго пинал 1С-ников греша на то, что козлы они и не могут нормально сделать, и таки они во многих моментах халтурили, но в процессе всплыло вот что. Излагаю очень интересную и познавательную историю.

В стандартный модуль "Интернет-Магазин" привязываем 1С.
Делаем все по инструкции на сайте netcat.
На этом этапе пришлось долго гонять 1С-ников чтобы смогли сгенерировать нормально файлы import.xml и offers.xml и в итоге проходим первый этап - ручная синхронизация, получаем от системы ссылку, по которой надо настроить автообмен вида
Код:
https://examplesite.ru/netcat/modules/netshop/import/3/1c8.php
, отдаем ссылку вместе с логином и паролем из настроек модуля 1С-никам. Просим проверить как работает автообмен. Получаем ответ от них о том что обмен не работает, не проходит авторизация и вообще у вас скрипт какой-то кривой проверяйте.
Нервно курим, пытаясь продумать место в котором не никто не будет слышать криков привязанного к дереву 1С-программиста (кто вообще придумал называть их программистами?), которого разрезают на мелкие части. Выдыхаем, открываем командную строку:
Код:

# curl --user login:password https://examplesite.ru/netcat/modules/netshop/import/3/1c8.php?mode=checkauth
# WRONG KEY

Так, видимо поживет еще 1С-ник...
Ок, открываем код /netcat/modules/netshop/import/3/1c8.php
Что у нас тут, ага авторизация
Код:

/**
* Server authorization
*/

if (
!isset($_SERVER['PHP_AUTH_USER']) ||
!(
$_SERVER['PHP_AUTH_USER'] == $secret_name &&
$_SERVER['PHP_AUTH_PW'] == $secret_key
)
) {
// sen auth headers
header('WWW-Authenticate: Basic realm="Authorization required"');
header('HTTP/1.0 401 Unauthorized');
// log message
if ($log_1c) file_put_contents($log_file, "wrong key" . PHP_EOL, FILE_APPEND);
// print message
echo "WRONG KEY";
// halt
exit;
}


Дописываем перед этим кодом
Код:
var_dump($_SERVER); die();


Еще раз отправляем запрос и парсим
Код:

# curl --user login:password https://examplesite.ru/netcat/modules/netshop/import/3/1c8.php?mode=checkauth | grep AUTH
# ["REDIRECT_REDIRECT_HTTP_AUTHORIZATION"]=> string(34) "Basic bmV0Y2F00jFBNlk1QzUxUktENklN"
# ["REDIRECT_HTTP_AUTHORIZATION"]=> string(34) "Basic bmV0Y2F00jFBNlk1QzUxUktENklN"


Ну конечно как же пройдет авторизация, если не с чем сравнивать.
Зато строку можно легко расшифровать и в ней и будет содержаться логин и пароль.
Модифицируем код
Код:

if( preg_match('/Basic+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches) )
{
list($_SERVER['PHP_AUTH_USER'],
$_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));
}

if (
!isset($_SERVER['PHP_AUTH_USER']) ||
!(
$_SERVER['PHP_AUTH_USER'] == $secret_name &&
$_SERVER['PHP_AUTH_PW'] == $secret_key
)
) {
// sen auth headers
header('WWW-Authenticate: Basic realm="Authorization required"');
header('HTTP/1.0 401 Unauthorized');
// log message
if ($log_1c) file_put_contents($log_file, "wrong key" . PHP_EOL, FILE_APPEND);
// print message
echo "WRONG KEY";
// halt
exit;
}


и пробуем еще раз

Код:

# curl --user login:password https://examplesite.ru/netcat/modules/netshop/import/3/1c8.php?mode=checkauth
# success
# nc-import-cookie


Просим 1С-ника протестить еще раз автообмен и надеемся на то что теперь то у него все получится, а разработчики netcat исправят это недоразумение в следующих обновлениях.

А так же исправят еще 1 момент, который может ввести в заблуждение и находится в файлах /netcat/modules/netshop/import/commerceml.php на 843 строчке и /netcat/modules/netshop/import/commerceml2.php на 130 строчке.
Код:

printf(NETCAT_MODULE_NETSHOP_IMPORT_1C_LINK, "http://" . $HTTP_HOST . $SUB_FOLDER . $HTTP_ROOT_PATH . "modules/netshop/import/1c.php?source_id=$source_id&key=" .
md5("$our_key$source_id") . "&a"); // sic!


Код:

printf(NETCAT_MODULE_NETSHOP_IMPORT_1C8_LINK,
"http://".$HTTP_HOST.$SUB_FOLDER.$HTTP_ROOT_PATH."modules/netshop/import/{$source_id}/1c8.php");


Неопытный разработчик просто скопирует ссылку и отдаст 1Снику.
Если сайт работает по HTTPS то 1С вместо ответа получит 301 код и работать не будет.

PS Если 1С-ник начнет говорить что у него снова не выходит каменный цветок и 1С выдает ошибку Удаленный узел не прошел проверку, то просто пристрелите его дайте ему почитать вот эту статью

Решаю нестандартные задачи
18.12.2018, 09:57
VenZell
Карагодников Алексей Николаевич
VenZell

Зарегистрирован:
2014-07-25
Сообщений: 77

Здравствуйте.
Вы пишите:
Цитата:
А так же исправят еще 1 момент, который может ввести в заблуждение и находится в файлах /netcat/modules/netshop/import/commerceml.php на 843 строчке и /netcat/modules/netshop/import/commerceml2.php на 130 строчке.


В актуальной версии системы подход к построению URL был изменен и описанная вами проблема больше не актуальна.

Я благодарю вас за подробное описание проблемы.
Я передам первое замечание разработчикам для исправления.
198 196 2018-12-18 09:57:01 15035
Описание проекта