Проблема модуля Битрикс
При сдаче одного из проектов по программе “Монитор качества” Битрикс, мы столкнулись с ошибкой в бесплатном модуле “Модуль приема платежей Тинькофф Банк”, монитор качества пожаловался на ошибку уязвимости “Проверена безопасность кода (статический анализ уязвимостей) (QSEC0080)”. А так как модуль это официальный от Тинькофф, мы во время работы над проектом не стали сразу исправлять, хотя и писали в службу поддержки. Пока проект делался, было не актуально, но при сдаче проекта, решили ее исправить и выложить решение, чтобы помочь другим.
Решение проблемы "Модуль приема платежей Тинькофф Банк"
При проверке вы увидите такое сообщение в “Мониторе качества”
Предлагается решение:
Межсайтовый скриптинг (XSS) уязвимость возникает тогда, когда данные, принятые от пользователя, выводятся в браузер без надлежащей фильтрации. Уязвимость может быть использована для изменения вида HTML страниц уязвимого сайта в контексте браузера целевого пользователя, похищения COOKIE данных браузера целевого пользователя, с последующим внедрением в его сессию, под его учетной записью.
Как защищаться
Использовать htmlspecialcharsbx. Параметры тегов с динамическими значениями ограничивать двойными кавычками. Принудительно добавлять протокол (http), где это необходимо, для значений параметров тегов, таких как href или src.
В подробном отчете следующий список ошибок
Вот перечень ошибок в модуле:
Файл: /personal/order/success.php
Cross-Site Scripting
15: $orderID = $_REQUEST['OrderId']
29: echo sprintf(getmessage("SALE_TINKOFF_SUCCESS_TEXT"),$orderID,$status,$statusPageURL)
Необходимые условия:
26: if($order)
Файл: /personal/order/success.php
Cross-Site Scripting
28: $statusPageURL = sprintf('%s/%s',getpagepath('personal/orders'),$orderID)
29: echo sprintf(getmessage("SALE_TINKOFF_SUCCESS_TEXT"),$orderID,$status,$statusPageURL)
Необходимые условия:
26: if($order)
Файл: /personal/order/success.php
Cross-Site Scripting
15: $orderID = $_REQUEST['OrderId']
31: echo sprintf(getmessage("SALE_TINKOFF_FAIL_TEXT"),$orderID)
Необходимые условия:
30: else
Файл: /personal/order/failed.php
Cross-Site Scripting
15: $orderID = $_REQUEST['OrderId']
29: echo sprintf(getmessage("SALE_TINKOFF_SUCCESS_TEXT"),$orderID,$status,$statusPageURL)
Необходимые условия:
26: if($order)
Файл: /personal/order/failed.php
Cross-Site Scripting
28: $statusPageURL = sprintf('%s/%s',getpagepath('personal/orders'),$orderID)
29: echo sprintf(getmessage("SALE_TINKOFF_SUCCESS_TEXT"),$orderID,$status,$statusPageURL)
Необходимые условия:
26: if($order)
Файл: /personal/order/failed.php
Cross-Site Scripting
15: $orderID = $_REQUEST['OrderId']
31: echo sprintf(getmessage("SALE_TINKOFF_FAIL_TEXT"),$orderID)
Необходимые условия:
30: else
Чтобы исправить эти все ошибки одним разом, надо открыть файл:
/bitrix/modules/tinkoff.payment/install/sale_payment/tinkoff/result.php
Найти часть кода
if (!$order) {
$arFilter = array(
"ACCOUNT_NUMBER" => $orderID,
);
$accountNumberList = CSaleOrder::GetList(array("ACCOUNT_NUMBER" => "ASC"), $arFilter);
$order = $accountNumberList->arResult[0];
}
if ($order) {
$status = $_REQUEST['Success'] == 'true' ? GetMessage("SALE_TINKOFF_SUCCESS") : GetMessage("SALE_TINKOFF_FAIL");
$statusPageURL = sprintf('%s/%s',GetPagePath('personal/orders'), $orderID);
echo sprintf(GetMessage("SALE_TINKOFF_SUCCESS_TEXT"), $orderID, $status, $statusPageURL);
} else {
echo sprintf(GetMessage("SALE_TINKOFF_FAIL_TEXT"), $orderID);
}
Его заменяем на:
if (!$order) {
$arFilter = array(
"ACCOUNT_NUMBER" => $orderID,
);
$accountNumberList = CSaleOrder::GetList(array("ACCOUNT_NUMBER" => "ASC"), $arFilter);
$order = $accountNumberList->arResult[0];
}
if ($order) {
$status = $_REQUEST['Success'] == 'true' ? GetMessage("SALE_TINKOFF_SUCCESS") : GetMessage("SALE_TINKOFF_FAIL");
$statusPageURL = GetMessage("SALE_TINKOFF_SUCCESS_TEXT_NEW_URL", Array("#URL1#" => GetPagePath('personal/orders'), "#URL2#" => $orderID));
echo GetMessage("SALE_TINKOFF_SUCCESS_TEXT_NEW", Array("#orderID#" => $orderID, "#status#" => $status, "#statusPageURL#" => $statusPageURL));
} else {
echo GetMessage("SALE_TINKOFF_FAIL_TEXT_NEW", array("#orderID#"=>$orderID) );
}
Так как мы заменили переменные языка, вам нужно будет также добавить переменные в ваш языковой файл
/bitrix/modules/tinkoff.payment/install/sale_payment/tinkoff/lang/ru/result.php
следующие переменные:
$MESS['SALE_TINKOFF_SUCCESS_TEXT_NEW'] = "Заказ с номером #orderID# оплачен #status#
Состояние заказа можно узнать на <\a href=\"#statusPageURL#\">странице заказа";
$MESS['SALE_TINKOFF_SUCCESS_TEXT_NEW_URL'] = "#URL1#/#URL2#";
$MESS['SALE_TINKOFF_FAIL_TEXT_NEW'] = "Заказ с номером #orderID# не найден";
И все, после проверки ошибка исчезнет.