|
Алексей
Алексей Царапкин
Зарегистрирован: 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С выдает ошибку Удаленный узел не прошел проверку, то просто пристрелите его дайте ему почитать вот эту статью
Решаю нестандартные задачи
|