作者: Fred F.M. Wang (FW知識瑣記) 日期: 2020/12/8
Codeigniter 搭配PHP 5.5版時,前端程式(View)送出(Submit)表單資料到後台程式(controller)
時發生錯誤訊息 core\Security.php : "preg_replace(): The /e modifier is deprecated, use
preg_replace_callback instead"
錯誤的程式 : \system\core\Security.php
錯誤的行: line 152, 153
$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);
return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);
原因 : /e 修飾符在PHP 5.5中已經棄用, 要用preg_replace_callback()取代
查到PHP官網的解釋
/e修飾符在PHP 5.5已不推薦使用會產生Warning, 在PHP 7已經移除, 因為它很容易產生安漏
洞,可以使用preg_replace_callback()取代
官網說明內容如下 (ref : https://www.php.net/manual/zh/reference.pcre.pattern.modifiers.php)
因此Codeigniter系統的 \system\core\Security.php程式中line 152, 153
$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);
return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);
要改寫成
$str = preg_replace_callback('~&#x(0*[0-9a-f]{2,5})~i', function($m){ return chr(hexdec($m[1])); }, $str);
return preg_replace_callback('~&#([0-9]{2,4})', function($m){ return chr(hexdec($m[1])); }, $str);
如此問題就解決了。