2015年6月5日金曜日

【備忘録】Trust Form 2.0のお問い合わせ完了画面にWarningが表示される

Trust Formのお問い合わせ完了画面にWarningが表示されるというつぶやきをみて、

を見てTrust Formプラグインのソース見たのですが、以下をサポートに投稿しようとしたら、うまくいっていないようなので、ここでメモっておきます。

ソースのいろいろなところで利用されているコード

foreach ( $this->name[0] as $key => $name ) {
  if ( preg_match('/['.$name.']/i', $body) ) {
  }
}

の部分など preg_matchを扱う場合において、データ($name)のチェックが足りないような気がします。

1. データなしの場合


preg_match('/[]/i', $body) の検索になってしまって、

Warning: preg_match(): Compilation failed: missing terminating ] for character class at offset 2 in .....

のようなエラーがでます。
で出てるエラーと同じですね。


2. 正規表現における「/」のエスケープ問題


preg_match('/[/]/i', $body) の検索になってしまって、エラーになり、

- preg_match error in trust-form.php 送信完了画面でpreg_matchエラー?が表示されます(Trust Formサポート in WordPress.org)

のような問題がおこるかなぁと思います。

対処方法


開発者の方にプログラムコードを修正してもらう必要があります。

以上の2つの対応については、

 foreach ( $this->name[0] as $key => $name ) {
   if ( !empty($name) && preg_match('/['. preg_quote($name).']/i', $body) ) {
   }
 } 

あたりになるかと思います。
もう少しコードをわかりやすく分解すると
 foreach ( $this->name[0] as $key => $name ) {
   if(!empty($name)){
     $name = preg_quote($name);

     if ( && preg_match('/['. $name .']/i', $body) ) {
     }
   }
 } 
ということになります。
$nameが空じゃなく、$nameの / などpregに影響を及ぼす文字はエスケープするというのを、それぞれいれこむという感じです。

2015年6月7日 @kimipooh

2 件のコメント:

  1. とか書いてたら、開発者本人からプルリク〜ってお言葉が @_@!!
    人生2度目のプルリクで、、、コード書くよりプルリク使い方わからなーい、、と悶える時間のほうが数倍かかってしまいました。なんとかプルリクしましたが,,,,,

    返信削除
  2. プルリクを承認していただいたので次のバージョンでフィックスされるかなーと思います〜
    https://github.com/horike37/Trust-Form/pulls

    返信削除