Skip to content

Commit c119d38

Browse files
authored
Merge pull request #1296 from EC-CUBE/fix/parameter-error-check-degression
Fix parameter validation error caused by PR #1157
2 parents 4c20699 + 9887250 commit c119d38

4 files changed

Lines changed: 75 additions & 2 deletions

File tree

data/class/SC_CheckError.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1786,7 +1786,12 @@ public function evalCheck($value)
17861786
return true;
17871787
}
17881788

1789-
return @eval('return is_scalar('.$value.');');
1789+
try {
1790+
return (bool) @eval('return is_scalar('.$value.');');
1791+
} catch (\Throwable $e) {
1792+
// eval の構文エラーや実行時エラーは例外として扱い、バリデーション失敗とする
1793+
return false;
1794+
}
17901795
}
17911796

17921797
/**

data/class/pages/admin/system/LC_Page_Admin_System_Parameter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public function errorCheck(&$arrKeys, &$arrForm)
141141
{
142142
$objErr = new SC_CheckError_Ex($arrForm);
143143
foreach ($arrKeys as $key) {
144-
$objErr->doFunc([$key, $arrForm[$key]], ['EXIST_CHECK', 'EVAL_CHECK']);
144+
$objErr->doFunc([$key, $key], ['EXIST_CHECK', 'EVAL_CHECK']);
145145
}
146146

147147
return $objErr->arrErr;

tests/class/SC_CheckError/SC_CheckError_EVAL_CHECKTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,43 @@ public function scenario()
7878
$this->objErr = new SC_CheckError_Ex($this->arrForm);
7979
$this->objErr->doFunc([self::FORM_NAME, self::FORM_NAME], [$this->target_func]);
8080
}
81+
82+
/**
83+
* シングルクォートのみの入力でFatal Errorが発生しないことを確認 (Issue #1297)
84+
*
85+
* PHP 8.3で構文エラーが発生する入力値でもバリデーションエラーとして
86+
* 処理され、Fatal Errorにならないことを確認
87+
*/
88+
public function testEVALCHECKDoesNotCauseFatalErrorWithSingleQuote()
89+
{
90+
$this->arrForm = [self::FORM_NAME => "'"];
91+
$this->expected = '※ form の形式が不正です。<br />';
92+
93+
$this->scenario();
94+
$this->verify('シングルクォートのみの入力でもFatal Errorにならず、バリデーションエラーになる');
95+
}
96+
97+
/**
98+
* 構文エラーを引き起こす値でFatal Errorが発生しないことを確認
99+
*/
100+
public function testEVALCHECKDoesNotCauseFatalErrorWithUnclosedString()
101+
{
102+
$this->arrForm = [self::FORM_NAME => '"unclosed string'];
103+
$this->expected = '※ form の形式が不正です。<br />';
104+
105+
$this->scenario();
106+
$this->verify('閉じられていない文字列でもFatal Errorにならず、バリデーションエラーになる');
107+
}
108+
109+
/**
110+
* 複数のシングルクォートでFatal Errorが発生しないことを確認
111+
*/
112+
public function testEVALCHECKDoesNotCauseFatalErrorWithMultipleSingleQuotes()
113+
{
114+
$this->arrForm = [self::FORM_NAME => "'''"];
115+
$this->expected = '※ form の形式が不正です。<br />';
116+
117+
$this->scenario();
118+
$this->verify('複数のシングルクォートでもFatal Errorにならず、バリデーションエラーになる');
119+
}
81120
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
class LC_Page_Admin_System_ParameterTest extends Common_TestCase
4+
{
5+
/**
6+
* PR #1157 によるデグレの再現テスト
7+
*
8+
* @see https://github.com/EC-CUBE/ec-cube2/pull/1296
9+
*
10+
* 変更前のコード([$key, $arrForm[$key]])では、日本語値が$value[1]に渡され、
11+
* createParam()で「判定対象配列キーに使用不可文字を含む」E_USER_ERRORが発生する
12+
*
13+
* 変更後のコード([$key, $key])ではE_USER_ERRORは発生しない
14+
* (ただし、EVAL_CHECKによるバリデーションエラーは返される)
15+
*/
16+
public function testErrorCheckDoesNotCauseFatalErrorWithJapaneseValue()
17+
{
18+
$page = new LC_Page_Admin_System_Parameter_Ex();
19+
$arrKeys = ['SAMPLE_ADDRESS'];
20+
$arrForm = ['SAMPLE_ADDRESS' => 'サンプル住所'];
21+
22+
// 変更前のコードではE_USER_ERRORが発生する
23+
// 変更後のコードではE_USER_ERRORは発生しない(Fatal Errorにならない)
24+
$arrErr = $page->errorCheck($arrKeys, $arrForm);
25+
26+
// Fatal Errorが発生せず、配列が返されることを確認
27+
$this->assertIsArray($arrErr);
28+
}
29+
}

0 commit comments

Comments
 (0)