web-dev-qa-db-ja.com

WordPressのプラグインとテーマに対するセキュリティのベストプラクティスは何ですか?

この質問で示唆されたように 、私はこのトピックを新しい質問として追加しています。プラグイン/テーマセキュリティのためのベストプラクティスに関するコミュニティディスカッション/投票のためです。

テーマのレビューに使用している現在の(進行中の)設定/データセキュリティチェックリストに基づいた最初のチェックリストです(原則は、プラグインとテーマの違いは変わらないはずです)。

安全でしっかりとコーディングされたテーマ設定ページでテーマをチェックアウトしたい場合は、このテーマをチェックしてください。
http://wordpress.org/extend/themes/coraline

21
Chip Bennett

ナンスを使用(設定APIを使用しない場合)

設定APIを使用していない場合は、プラグインとテーマで設定ページのナンスチェックを明示的に提供する必要があります。

13
Chip Bennett

データのサニタイズ、検証、およびエスケープ

フロントエンドとバックエンドの両方でデータベースに出入りできるものをサニタイズ(!)します。

プラグインとテーマは適切なデータ検証を実行する必要があります。

  1. データベースにデータを入力する前に、 および sanitize すべての信頼できないデータを検証します。
  2. エスケープ 「設定」フォームのフィールドに出力される前のすべての信頼できないデータ
  3. エスケープ テーマテンプレートファイルに出力される前のすべての信頼できないデータ

プラグインとテーマはテキスト入力にesc_attr()を、テキスト領域にesc_html()またはesc_textarea()を使うべきです。

WordPress APIからはesc_url()esc_url_raw()esc_js()そしてwp_filter_kses()も利用できます。

悪い例:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

良い例:

<a href="<?php echo esc_url($url); ?>">anchor</a>

これは、エスケープ関数の使い方を説明したMark Jaquithの素晴らしいビデオです。

12
Chip Bennett

$wpdb->prepareを使う

$wpdbオブジェクトを使ってカスタムクエリを作成するときは、$wpdb->prepareファミリ関数が誤ってすべてのユーザに教えているので、クエリにSQLコードを混在させて書き込む代わりに、常に mysql_* を使用してプレースホルダを値で埋めます。

9
Matteo Riva

$ _GET/$ _POST/$ _REQUESTのみを慎重に使用し、より良いAPIが利用できない場合にのみ使用してください。

プラグインとテーマは、$_POST$_REQUESTデータに直接依存するのではなく、設定APIを使用してフォーム入力データを取得および保存する必要があります。

9
Chip Bennett

悪意のあるコードを実行するために使用される可能性のあるPHP関数には注意してください

PHPを書いている人は誰でも読んでください: Exploitable PHP functions StackOverflowで。

テーマ変更APIを使用

テーマは set_theme_mod() とそれに関連する関数 not を自分で考案した名前体系を使うべきです。
theme_mod APIは、設定API用の特別な層です。これは一意の名前を保証し、すべてのオプションを one arrayにプッシュします。私の経験からすると、はるかに扱いやすくなっています。加えて、プラグイン用の標準化されたフィルタを提供します - これは相互運用性に適しています。

有効にしない register_globals

register_globals = onに頼らないでください。私の最後のクライアントが買ったPro Themeはこれを正確に行います。 5分でこのテーマを使っているサイトをハッキングすることができました…
ThimbThumbもこれを行いました(そしてまだ行っていますか?).

不要なワイドアクセス許可を持つファイルを作成しないでください

過度に自由なアクセス許可を持つファイルを作成しないでください。

利用可能な場合はSSLを使用する

可能であれば、Twitter/Facebook /その他すべてで共有リンクをHTTPS URIにリンクします。読者のセキュリティも重要です。

8
fuxia

データを単一の配列に保存する

プラグインとテーマは、設定ページに複数のオプションを作成するのではなく、オプションを単一の配列に保存する必要があります。 Settings APIを使用するとこれを処理できます。

7
Chip Bennett

設定ページを追加および出力するときに適切な機能を確認する

プラグインは設定ページを追加する機能のために適切な capability (例えばmanage_options)を使用するべきです。

テーマは設定ページを追加するために適切な capability としてedit_theme_optionsを使用するべきです。

6
Chip Bennett

最新のチュートリアルと情報を使用する

プラグインとテーマは、オプションと設定ページの両方を意図的に実装し、notコピーアンドペーストWebサイトチュートリアルに依存する必要があります。 、以下にリストされているものなど。

何をしないかの例

5
Chip Bennett

設定APIを使用する

プラグインとテーマはSettings APIを使用するべきです。これはより使いやすく、より安全で、設定ページの大変な仕事の多くを引き受けます。

設定APIの使用に関する優れたチュートリアルについては、以下を参照してください。

4
Chip Bennett

同じドメイン上のページにアクセスする場合は、phpのheader()関数を直接呼び出す代わりに wp_safe_redirect() を使用してください。

1
mfields

関数名と変数名のプレフィックス

プラグインはすべてのオプション、カスタム関数、カスタム変数、そしてカスタム定数の前にplugin-slugを付けるべきです。

テーマはすべてのオプション、カスタム関数、カスタム変数、およびカスタム定数の前にtheme-slugを付けるべきです。

1
Chip Bennett

チェックボックスと選択オプションについては、PluginsとThemesはそれぞれchecked="checked"selected="selected"を出力するためにchecked()selected()関数を使うべきです。

1
Chip Bennett

管理者メニューの適切なセクションに設定ページを追加する

トップレベルのメニューを追加するためにadd_options_page()を使用するのではなく、プラグインはadd_menu_page()関数を使用してPlugin Settings PageをSettingsメニューに追加する必要があります。

add_theme_page()を使ってトップレベルのメニューを追加するのではなく、テーマはadd_menu_page()関数を使ってAppearanceメニューにテーマ設定ページを追加するべきです。

0
Chip Bennett