Загрузка...
Битрикс

Модуль приема платежей Тинькофф Банк - исправляем ошибки протоактивной защиты в Битрикс

Модуль приема платежей Тинькофф Банк - исправляем ошибки протоактивной защиты в Битрикс

Проблема модуля Битрикс

 

При сдаче одного из проектов по программе “Монитор качества” Битрикс, мы столкнулись с ошибкой в бесплатном модуле “Модуль приема платежей Тинькофф Банк”, монитор качества пожаловался на ошибку уязвимости “Проверена безопасность кода (статический анализ уязвимостей) (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# не найден";

 

И все, после проверки ошибка исчезнет.