私はconfig.phpファイルを更新する動的な方法に取り組んでいましたが、完全には解決できない興味深い不具合に遭遇しました。以下は、config.phpファイルを更新するための私のコードです。
if( isset( $_POST['submitted'] ) ) {
$config_keys = array();
foreach( $_POST as $key => $value ) {
if( substr( $key, 0, 7 ) == 'config-' ) {
$config_keys[ substr( $key, 7 ) ] = $value;
}
}
$config_content = file_get_contents( dirname(__FILE__) . '/../../inc/config.php' );
foreach( $config_keys as $key => $value ) {
$config_content = preg_replace(
"/config\['$key'\](\s*)=(\s*)(['\"]?).*?(['\"]?);/",
"config['$key']$1=$2$3$value$4;",
$config_content
);
$config[$key] = $value;
}
file_put_contents( dirname(__FILE__) . '/../../inc/config.php', $config_content );
}
論理はかなり健全です。「config-」で始まるPOST変数を検索し、「config-」の後のすべてを、更新する構成ファイルのキーの名前として使用します。構成ファイルの形式は次のとおりです。
$config['var1'] = 'value1';
$config['var2'] = 123;
$config['var3'] = '...';
90%の場合、これは完全に機能し$valueますが、数字で始まる場合$3、の最初の数字は$value置換中に完全に無視されます。
たとえば、設定ファイルには次の値があります。
$config['ls_key'] = '136609a7b4....'; // Rest of key has been truncated
この値を変更せずにキーを変更せずにフォームを送信すると、この行は突然次のようになります。
$config['ls_key'] = 36609a7b4...'; // Rest of key has been truncated
一重引用符がないため、構成ファイルの解析(サイト全体の破損)が妨げられ、起動するデータが失われます。PHP preg_replaceのマニュアルを読んだ後、いくつかの場所で中括弧を使用してみました(「例#1後方参照とそれに続く数値リテラルの使用」を変更)。次のいずれも機能しませんでした。
"config['$key']$1=$2${3}$value$4;",
"config['$key']$1=$2$3${value}$4;",
"config['$key']$1=$2$3{$value}$4;",
"config['$key']$1=$2{$3}$value$4;", // This one actually leads to syntax errors
"config['$key']${1}=${2}${3}$value${4};",
最初の3つはまったく同じ問題を引き起こし、交換には影響しません。4番目はまったく機能せず(構文エラー)、5番目は実際にはすべての後方参照が無視されます。また、次のように一重引用符と連結を使用してみました。
'config[\'$key\']$1=$2$3' . $value . '$4;',
繰り返しになりますが、前の3つの例と元のスクリプトと同じ問題が発生しました。
誰かがこれを以前に解決したか、少なくとも新しいアイデアを持っていることを願っています。