PostfixAdminで転送先設定をユーザとドメイン管理者がしようとしたときに改行コードがrnと化けて正常に処理されない問題について。
[インストールディレクトリ]/edit-alias.phpの79行目−83行目で改行コードを抜く処理をしている。
80行目のコードで、せっかく置き換えた文字列$gotoではなくてPOSTで送られてきた$fGotoを参照しているのが原因。
$goto = preg_replace (‘/rn/’, ‘,’, $fGoto);
$goto = preg_replace (‘/rn/’, ‘,’, $fGoto); ←これ
$goto = preg_replace (‘/[s]+/i’, ”, $goto);
$goto = preg_replace (‘/,*$/’, ”, $goto);
$array = preg_split (‘/,/’, $goto);
で、こういう風に直せば解決。
$goto = preg_replace (‘/rn/’, ‘,’, $fGoto);
$goto = preg_replace (‘/rn/’, ‘,’, $goto);
$goto = preg_replace (‘/[s]+/i’, ”, $goto);
$goto = preg_replace (‘/,*$/’, ”, $goto);
$array = preg_split (‘/,/’, $goto);
備忘録として。
追記
説明が足りませんでした。
“Postで送られてきたfGoto”は、63行目でescape_string関数で変換されてます。
$fGoto = escape_string ($_POST['fGoto']);
escape_string関数はfunctions.inc.phpに含まれていて、以下のようなもの。
function escape_string ($string)
{
global $CONF;
if (get_magic_quotes_gpc () == 0)
{
if ($CONF['database_type'] == “mysql”) $escaped_string = mysql_real_escape_string ($string);
if ($CONF['database_type'] == “mysqli”) $escaped_string = mysqli_real_escape_string ($string);
if ($CONF['database_type'] == “pgsql”) $escaped_string = pg_escape_string ($string);
}
else
{
$escaped_string = $string;
}
return $escaped_string;
}
つまり、使っているデータベースの種類にしたがって、文字列にエスケープコードを付けてSQLインジェクションを防ごう、という関数。
これによって改行コードである”rn”は”rn”されているのに、80行目でなぜか”rn”で処理しようとしている、ということ。
つまり、80行目を修正せずにコメントアウトでもこの処理を直すことが出来る。