-------------------------------------------------------------------
■脆弱性の種類
-------------------------------------------------------------------
認可回避の脆弱性
-------------------------------------------------------------------
■不具合が存在するEC-CUBEのバージョン
-------------------------------------------------------------------
EC-CUBE 2.11.0~2.12.2
2.11.0
2.11.1
2.11.2
2.11.3
2.11.4
2.11.5
2.12.0
2.12.1
2.12.2
-------------------------------------------------------------------
■修正方法について
-------------------------------------------------------------------
/data/class/pages/shopping/LC_Page_Shopping_Multiple.php::lfCheckError
に以下の変更を加えます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.12.0以上のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Multiple.php::lfCheckError
221行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
変更前
-----------------------------------------------------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objCartSess = new SC_CartSession_Ex();
$objFormParam->convParam();
// 数量未入力は0に置換
$objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0));
$arrErr = $objFormParam->checkError();
$arrParams = $objFormParam->getSwapArray();
if (empty($arrErr)) {
foreach ($arrParams as $index => $arrParam) {
// 数量0で、お届け先を選択している場合
if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。';;
}
// 数量の入力があり、お届け先を選択していない場合
if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ お届け先が入力されていません。';
}
}
}
-------------------------------------------------------------------
-------------------------------------------------------------------
変更後
-------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objCartSess = new SC_CartSession_Ex();
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objCustomer = new SC_Customer_Ex();
$objFormParam->convParam();
// 数量未入力は0に置換
$objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0));
$arrErr = $objFormParam->checkError();
$arrParams = $objFormParam->getSwapArray();
if (empty($arrErr)) {
foreach ($arrParams as $index => $arrParam) {
// 数量0で、お届け先を選択している場合
if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。';;
}
// 数量の入力があり、お届け先を選択していない場合
if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ お届け先が入力されていません。';
}
}
}
if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) {
$deliv_check_flg = true;
foreach ($arrParams as $index => $arrParam) {
if ($arrParam['shipping'] != 0) {
$deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id')));
if ($deliv_check < 1) {
$deliv_check_flg = false;
break;
}
}
}
if (!$deliv_check_flg) {
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
SC_Response_Ex::actionExit();
}
}
=================================================================================================================
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.11.2~2.11.5のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Multiple.php::lfCheckError
210行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
変更前
-----------------------------------------------------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objCartSess = new SC_CartSession_Ex();
$objFormParam->convParam();
// 数量未入力は0に置換
$objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0));
$arrErr = $objFormParam->checkError();
$arrParams = $objFormParam->getSwapArray();
if (empty($arrErr)) {
foreach ($arrParams as $index => $arrParam) {
// 数量0で、お届け先を選択している場合
if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。';;
}
// 数量の入力があり、お届け先を選択していない場合
if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ お届け先が入力されていません。';
}
}
}
-------------------------------------------------------------------
-------------------------------------------------------------------
変更後
-------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objCartSess = new SC_CartSession_Ex();
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objCustomer = new SC_Customer_Ex();
$objFormParam->convParam();
// 数量未入力は0に置換
$objFormParam->setValue('quantity', $objFormParam->getValue('quantity', 0));
$arrErr = $objFormParam->checkError();
$arrParams = $objFormParam->getSwapArray();
if (empty($arrErr)) {
foreach ($arrParams as $index => $arrParam) {
// 数量0で、お届け先を選択している場合
if ($arrParam['quantity'] == 0 && !SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ 数量が0の場合、お届け先を入力できません。';;
}
// 数量の入力があり、お届け先を選択していない場合
if ($arrParam['quantity'] > 0 && SC_Utils_Ex::isBlank($arrParam['shipping'])) {
$arrErr['shipping'][$index] = '※ お届け先が入力されていません。';
}
}
}
if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) {
$deliv_check_flg = true;
foreach ($arrParams as $index => $arrParam) {
if ($arrParam['shipping'] != 0) {
$deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id')));
if ($deliv_check < 1) {
$deliv_check_flg = false;
break;
}
}
}
if (!$deliv_check_flg) {
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
exit;
}
}
=================================================================================================================
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=================================================================================================================
▽2.11.0~2.11.1のバージョンは以下を参考下さい
-----------------------------------------------------------------------------------------------------------------
▽LC_Page_Shopping_Multiple.php::lfCheckError
209行目付近を変更下さい。
-----------------------------------------------------------------------------------------------------------------
変更前
-----------------------------------------------------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objFormParam->convParam();
return $objFormParam->checkError();
}
-------------------------------------------------------------------
-------------------------------------------------------------------
変更後
-------------------------------------------------------------------
function lfCheckError(&$objFormParam) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objCustomer = new SC_Customer_Ex();
$objFormParam->convParam();
$arrErr = $objFormParam->checkError();
$arrParams = $objFormParam->getSwapArray(array('shipping'));
if ($objCustomer->isLoginSuccess(true) && SC_Utils_Ex::isBlank($arrErr)) {
$deliv_check_flg = true;
foreach ($arrParams as $index => $arrParam) {
if ($arrParam['shipping'] != 0) {
$deliv_check = $objQuery->count('dtb_other_deliv','other_deliv_id = ? AND customer_id = ?', array($arrParam['shipping'], $objCustomer->getValue('customer_id')));
if ($deliv_check < 1) {
$deliv_check_flg = false;
break;
}
}
}
if (!$deliv_check_flg) {
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
exit;
}
}
return $arrErr;
}
=================================================================================================================