• こちらのプラグインを申請したのですが、サニタイズができてないらしく、申請が通りません。
    https://github.com/matometaru/Comment-Star-Rating

    返ってきた返答は以下の通りです。
    $this->options = $_POST[$this->text_domain];
    That sets your option name to be a NON sanitized value.

    issetやfilter_inputを使ってみましたが、完全じゃないようです。
    会社のプログラマにも聞いたのですが、わからないとのことでした。
    (WordPressプラグイン開発のバイブルは一通り読みました。)

    どうか宜しくお願いします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • モデレーター Takayuki Miyoshi

    (@takayukister)

    レビュワーの指摘と参照しているコードがちょっと食い違っているような気がしないでもないですが、おそらく本当に問題なのはここじゃないかと思います。

    https://github.com/matometaru/Comment-Star-Rating/blob/master/comment-star-rating.php#L292

    この $this->text_domain というプロパティですが、ざっと見ただけですけど特にアクセス権とか指定してないんじゃないですか? これだとこのクラスの外からでも変更可能になって危ないですよ。見たところ固定値のようなので、定数とか使うように変更できないか検討してみてはいかがでしょうか。

    トピック投稿者 matometaru

    (@metaru)

    Takayuki Miyoshiさん
    ありがとうございます!

    考えてみると、確かにその通りですね。
    他の人が$this->text_domainにアクセスすることを想定しておりませんでした。

    定数を宣言していたので、それを使用するように変更いたしました。
    こちらで提出してみます。

    トピック投稿者 matometaru

    (@metaru)

    返事がきました。

    $options = $_POST[COMMENT_STAR_RATING_DOMAIN];
    // post_type sanitai
    foreach ( $post_types as $post_type ) {
    if( isset($options[‘post_type’][$post_type]) ) {
    $options[‘post_type’][$post_type] = ‘1’;
    }
    }

    That is still wrong.
    This is not sanitized: $options = $_POST[COMMENT_STAR_RATING_DOMAIN];
    The problem is ANYTHING goes into $options
    What is an example VALUE of $_POST[COMMENT_STAR_RATING_DOMAIN] going to be?

    if ( !empty($_POST[COMMENT_STAR_RATING_DOMAIN]) ) {
    $options = $_POST[COMMENT_STAR_RATING_DOMAIN];
    }

    >> What is an example VALUE of $_POST[COMMENT_STAR_RATING_DOMAIN] going to be?
    $_POSTの値は以下のような可変サイズの配列です。

    
    array (size=3)
      'post_type' => 
        array (size=2)
          'post' => string '1' (length=1)
          'page' => string '1' (length=1)
      'url' => string '1' (length=1)
      'email' => string '1' (length=1)
    array (size=2)
      'post_type' => 
        array (size=1)
          'post' => string '1' (length=1)
      'url' => string '1' (length=1)

    少し分かってきた気がします。
    現状は以下の$_POST[‘dummy’]も保存してしまうことが問題ということでしょうか?
    (もしそうなら、$optionsに入れる前にunsetやmergeを使って配列から不要なデータを除けばこの件はクリアできそうでしょうか?)

    
    array (size=4)
      'post_type' => 
        array (size=2)
          'post' => string '1' (length=1)
          'page' => string '1' (length=1)
      'url' => string '1' (length=1)
      'email' => string '1' (length=1)
      'dummy' => string '1' (length=1)

    なにとぞよろしくお願いいたします。

    • この返信は8年、 1ヶ月前にmatometaruが編集しました。
    Nora

    (@nora0123456789)

    保存すべき値をもっと厳選しろという意味じゃないでしょうか?

    つまり、最初に「$options」に$_POST[COMMENT_STAR_RATING_DOMAIN]を丸ごと取得してしまっているため、
    その後の条件で「”1″」を定義してもしなくても、一度丸ごと取得した部分が精査されていないということだと思います。
    ですので、先に取得するなら代替的な変数に先に取得して、
    保存する変数「$options」にはもっと保存すべき値を精査すべきということじゃないかと。

    
    $temp = $_POST[COMMENT_STAR_RATING_DOMAIN];
    foreach( . . . ) {
      if( . . . ) {
        $options = sanitize_function( $_POST[...][...] ); // or whatever you want to set
      }
    }

    また、指摘されていることとは異なりますが、カウントが0の場合の「$this->ratings_arrange」の値が定義されていませんので、「d3_init」で定義される変数「dataset」にシンタックスエラーが起きませんか?

    的外れでしたら申し訳ありません。

    • この返信は8年、 1ヶ月前にNoraが編集しました。
    • この返信は8年、 1ヶ月前にNoraが編集しました。
    トピック投稿者 matometaru

    (@metaru)

    ありがとうございます。

    以下のように修正することができました。

    foreach ( $_POST[COMMENT_STAR_RATING_DOMAIN] as $key => $value ) {
    	if( in_array( $key, $key_array) ){
    		$key = $key;
    	}else{
    		break;
    	}
    	$value = '1';
    	$options += array( $key => $value );
    }

    >ratings_arrange」の値が定義されていませんので、「d3_init」で定義される変数「dataset」にシンタックスエラーが起きませんか?

    こちらについても確認ありがとうございます!
    修正いたしました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「プラグインを申請したのですが、サニタイズができてないとのことで申請が通りません。」には新たに返信することはできません。