web-dev-qa-db-ja.com

ユーザーがユーザーオプションとして変更したくないユーザー設定を保存しても安全ですか?

私は私のサイトのプロフィールページにいくつかのカスタムユーザーオプションを追加しました、そしてユーザーが自分自身を変更しても大丈夫です。これらのオプションは独自のセクションにあります。ユーザーは読み取り権限を持ち、バックエンドにアクセスして自分のプロファイルの設定を変更することができます。

ユーザーに直接変更させたくないというユーザー別のオプションがあります。そのオプショングループとセクションを作成するコードがあり、そのユーザーが他のユーザーのプロファイルを編集できるかどうかを確認します。それができない場合、そのセクションと設定はWordPressに登録されていません(したがってプロファイルページには表示されません)。適切な権限を持つ人だけが、バックエンドを介してプロファイルの編集ページにアクセスして設定を表示および変更できます。

悪意のあるユーザーが別の有効なプロファイルの更新と共にPOSTデータを追加で送信し、ページに登録されていないがデータベースに存在するオプションを設定することはできますか?この保護はどの程度確実ですか。それに関する既知の問題はありますか?

6
jeremiahs

たとえスニペットであっても、あなたが(利用可能であれば)あなたが作業しているコードを提出するべきです。

しかし、簡単な答えはYESです。

  • 特定のユーザーロールのユーザープロファイルページに入力フィールドが表示されないようにする
  • 許可されていないユーザーがユーザーメタをデータベースに保存できないようにする

最初:

ユーザーのメタデータに関連する入力フィールドがユーザープロファイルページの特定のユーザーロールから隠されている場合、 "attacker"はguessフィールドのmeta_keyと一致する必要があります。彼らが居住したいのです。 頑張ってください!

その次に:

問題のmeta_keyを推測できた場合は、update_user_metaまたはadd_user_metaに関連する関数を実行する必要があります。彼らができる唯一の方法は、

  • 彼らは入力フィールドを見ることができます
  • あなたは条件付きステートメントでユーザー機能をチェックするのに失敗しました。

...そうすれば、そうでなければユーザーはそれらのユーザーメタフィールドを保存または編集することができます。 隠された 画面上の要求に追加/レンダリングされません。

我々はそれを仮定します、

  • ユーザーが自分のサイトの他の場所で自分で選択した任意のスクリプトを実行するための他の手段は提供されません。

...そもそも攻撃が発生するリスクを軽減します。

まず最初に、 current_user_can 関数でユーザーメタデータの追加や編集に関連する関数をラップします。

if ( current_user_can('edit_users') ) {

    //show input fields function

    //allow input fields to be updated function
}

これは現在のユーザが実際にできるかどうかをチェックします edit_users which デフォルトでスーパーアドミニストレータとアドミニストレータだけが利用できます あなたが選択した別のユーザロールにこの機能を許可しない限り。

これはあなたがしたいと思うかもしれない唯一のチェックではありませんが、確かにそれは安全のために含めるべき最も重要なものの一つです。

6
userabuser