WordPressプラグインとテーマのセキュリティのベストプラクティスとは何ですか?[閉まっている]


22

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

テーマの確認に使用する現在の(進行中の)設定/データセキュリティチェックリストに基づく開始チェックリストを以下に示します(原則はプラグインでもテーマと同じである必要があります)。

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


適切な特権を持っている人がこれをコミュニティWikiにしたいと思ったら?
チップベネット

Wikiモードで質問を取得するには、modが質問に適切にタグを付ける必要があり、modの注意を引くためにフラグを立てました。これは時間の問題です。.:)
t31os

コラリンの何がそんなに特別なのですか?イモはまだ入る方法があります。私はアストンA instedをリンクすることをお勧めします:wordpress.stackexchange.com/questions/13539/…–
kaiser

コララインについて特に特別なものはないかもしれません。これは、テーマをレビューするときにテーマ開発者に現在示しているものです。これは、初期のセキュリティ固有のテーマレビューの多くを行ったジャスティンタドロックの例だからです。私も良い例としてワイン醸造学を提供しますが、私は自分のテーマをポン引きしようとするのに出くわしたくありません。:)
チップベネット

回答:


13

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

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


12

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

フロントエンドとバックエンドの両方でデータベースに出入りする可能性のあるものはすべてサニタイズしてください!

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

  1. データベースにデータを入力する前に、すべての信頼できないデータを検証およびサニタイズします
  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>

これは、エスケープ機能の使用法を説明するマークジャキースの素晴らしいビデオです。


3
途中で
消毒

9

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

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


3
常に$ _POST、$ _ REQUEST、および$ _GETを安全でないものとして扱います。それらの配列の値をサニタイズおよびホワイトリスト化し、独自の変数に入れます。ユーザーからの値をサニタイズして、$ _ POSTに戻さないでください。
ゴールデンアップル

2
使用する必要があるキーが適切な配列に設定されていることを常に確認してください。isset()はあなたの友人です:)
mfields

9

つかいます $wpdb->prepare

$wpdbオブジェクトを介してカスタムクエリを作成するとき$wpdb->prepareは、クエリをSQLコードと混合したデータで記述するのではなく、常にプレースホルダーを値で埋めるために使用しmysql_*てください。


$wpdb->prepareない準備された文と同じ。
-hakre

8

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

PHPを書いている人にとっては朗報です:StackOverflowで悪用可能なPHP関数

テーマ変更APIを使用する

テーマは、独自の名前体系ではなくset_theme_mod()関連する機能を使用する必要があります。 theme_mod APIは、設定API専用のレイヤーです。一意の名前を保証し、すべてのオプションを1つの配列にプッシュします。私の経験からすると、処理がはるかに簡単です。さらに、プラグイン用の標準化されたフィルターを提供します。これは相互運用性に適しています。

有効にしない register_globals

に依存しないでくださいregister_globals = on。私の最後のクライアントが購入したプロのテーマはまさにこれを行います。5分でこのテーマを使用して任意のサイトをハッキングできました…
ThimbThumbもこれを実行しました(まだ実行していますか)。

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

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

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

あなたのポイントのTwitter / Facebookの/何の上で共有可能な場合HTTPS URIへのリンク。読者のセキュリティも重要です。


2
set_theme_mod()特に、それをSettings APIの使用法と適切に組み合わせる方法について詳しく説明してください。
チップベネット

@Chip Bennett回答に情報を追加しました。
FUXIA

このミニリストをより具体的な回答に分解できますか?コミュニティWikiを小さなチャンクで管理しやすくなりました。TIA
11年

3
チップ:Theme modシステムはSettings APIとあまりうまく統合しません。すぐにそれを行う方法を説明する投稿を作成します。
オットー

7

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

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


6

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

プラグインは、設定ページを追加する機能に適切な機能manage_options)を使用する必要があります。

テーマは、設定ページを追加するedit_theme_options適切な機能として使用する必要があります。


1
小さいながらも重要な注意:edit_theme_options設定APIで使用することはできませんが、オプションのmanage_options送信は更新を送信するために必要になるようにハードコードされています。関連するTracチケットはここで見つけることができます
t31os

本当ですが、1)編集者のみに影響し、管理者には影響しません。2)願わくば、リンクされたTracチケットを介してすぐに対処されることを願っています。
チップベネット

カスタムロールまたは通常のロールにedit_theme_options上限が与えられる可能性は常にありmanage_optionsます。現在の状態の設定APIは、機能を持つロールでのみ使用可能であることを指摘すると便利だと思います。
t31os

5

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

プラグイン&テーマはオプションと設定ページが意図的にし、実装する必要があり、両方ではない時代遅れであり、このような下に列挙したような適切なデータセキュリティを、含まれていないコピー&ペーストウェブサイトのチュートリアルに依存しています。

してはいけないことの例:


1
少し強調したテキストを追加して、リンクがすべきでないことの例であることを示しています。情報をざっと読み、リンクの前の段落を読まずにリンクをクリックするのは簡単だからです。また、私がそこにいる間に答えを少しきれいにしました...;)
t31os

2
これは、チュートリアルの例が間違っている方法や古い方法で行っていることを正確に説明するものです。
11年

4

設定APIを使用する

プラグインとテーマは設定APIを使用する必要があります。設定APIは使いやすく、より安全で、設定ページの多くの面倒な作業を処理します。

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


設定APIとテーマオプションに関して、この回答に関する私のコメントを参照してください。
t31os

1

チェックボックスを選択オプションについては、プラグインとテーマを使用する必要がありますchecked()し、selected()出力するための機能をchecked="checked"してselected="selected"、それぞれ。


私が何かを見逃していない限り、本当にセキュリティの問題ではありません。それでも非常に便利で使いやすい。:)
ラースト

まあ、おそらくそしておそらくそうではない。同じことを達成するためのカスタムコードがたくさんあります。より多くのコードスパゲッティ=セキュリティリスクを導入する機会が増えます。:)
チップベネット

Bennet-toschoでのメール送信から数日前-二人とも言えると思う-そのための最も単純な関数は、それらの関数よりも読みやすく、理解しやすい。私はダウンしていませんが、これも支持していません。Imoこれはコアの一部であってはなりません。何の価値も追加しないからです。
カイザー

2
私はあなたたちはそれよりも簡単です思い付いた好奇心が強いですchecked( $theme_options['whatever_option'] )checked( 'some_value' == $theme_options['whatever_option'] )。それよりも簡潔になる方法がわかりませんか?
チップベネット

1

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

プラグインは、すべてのオプション、カスタム関数、カスタム変数、カスタム定数の前にplugin-slugを付ける必要があります。

テーマは、すべてのオプション、カスタム関数、カスタム変数、カスタム定数の前にtheme-slugを付ける必要があります。


これをすべてのクラス名、およびpost_typesやtaxonomiesなどのカスタムオブジェクトの名前に拡張します。
mfields


0

設定メニューを管理メニューの適切なセクションに追加します

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

テーマは、トップレベルメニューを追加するのではなく、add_theme_page()関数を使用してテーマ設定ページをAppearanceメニューadd_menu_page()に追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.