この質問で示唆されたように 、私はこのトピックを新しい質問として追加しています。プラグイン/テーマセキュリティのためのベストプラクティスに関するコミュニティディスカッション/投票のためです。
テーマのレビューに使用している現在の(進行中の)設定/データセキュリティチェックリストに基づいた最初のチェックリストです(原則は、プラグインとテーマの違いは変わらないはずです)。
安全でしっかりとコーディングされたテーマ設定ページでテーマをチェックアウトしたい場合は、このテーマをチェックしてください。
http://wordpress.org/extend/themes/coraline
設定APIを使用していない場合は、プラグインとテーマで設定ページのナンスチェックを明示的に提供する必要があります。
フロントエンドとバックエンドの両方でデータベースに出入りできるものをサニタイズ(!)します。
プラグインとテーマは適切なデータ検証を実行する必要があります。
エスケープ テーマテンプレートファイルに出力される前のすべての信頼できないデータ
プラグインとテーマはテキスト入力に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の素晴らしいビデオです。
$wpdb->prepare
を使う$wpdb
オブジェクトを使ってカスタムクエリを作成するときは、$wpdb->prepare
ファミリ関数が誤ってすべてのユーザに教えているので、クエリにSQLコードを混在させて書き込む代わりに、常に mysql_*
を使用してプレースホルダを値で埋めます。
プラグインとテーマは、$_POST
と$_REQUEST
データに直接依存するのではなく、設定APIを使用してフォーム入力データを取得および保存する必要があります。
PHPを書いている人は誰でも読んでください: Exploitable PHP functions StackOverflowで。
テーマは set_theme_mod()
とそれに関連する関数 not を自分で考案した名前体系を使うべきです。
theme_mod APIは、設定API用の特別な層です。これは一意の名前を保証し、すべてのオプションを one arrayにプッシュします。私の経験からすると、はるかに扱いやすくなっています。加えて、プラグイン用の標準化されたフィルタを提供します - これは相互運用性に適しています。
register_globals
register_globals = on
に頼らないでください。私の最後のクライアントが買ったPro Themeはこれを正確に行います。 5分でこのテーマを使っているサイトをハッキングすることができました…
ThimbThumbもこれを行いました(そしてまだ行っていますか?).
過度に自由なアクセス許可を持つファイルを作成しないでください。
可能であれば、Twitter/Facebook /その他すべてで共有リンクをHTTPS URIにリンクします。読者のセキュリティも重要です。
プラグインとテーマは、設定ページに複数のオプションを作成するのではなく、オプションを単一の配列に保存する必要があります。 Settings APIを使用するとこれを処理できます。
プラグインは設定ページを追加する機能のために適切な capability (例えばmanage_options
)を使用するべきです。
テーマは設定ページを追加するために適切な capability としてedit_theme_options
を使用するべきです。
プラグインとテーマは、オプションと設定ページの両方を意図的に実装し、notコピーアンドペーストWebサイトチュートリアルに依存する必要があります。 、以下にリストされているものなど。
何をしないかの例:
wordpressテーマのオプションページの作成方法 (1stwebdesigner.com)
素晴らしいWordPressテーマオプションページパート1を作成する (wpshout.com)
プラグインとテーマはSettings APIを使用するべきです。これはより使いやすく、より安全で、設定ページの大変な仕事の多くを引き受けます。
設定APIの使用に関する優れたチュートリアルについては、以下を参照してください。
同じドメイン上のページにアクセスする場合は、phpのheader()関数を直接呼び出す代わりに wp_safe_redirect() を使用してください。
プラグインはすべてのオプション、カスタム関数、カスタム変数、そしてカスタム定数の前にplugin-slugを付けるべきです。
テーマはすべてのオプション、カスタム関数、カスタム変数、およびカスタム定数の前にtheme-slugを付けるべきです。
チェックボックスと選択オプションについては、PluginsとThemesはそれぞれchecked="checked"
とselected="selected"
を出力するためにchecked()
とselected()
関数を使うべきです。
トップレベルのメニューを追加するためにadd_options_page()
を使用するのではなく、プラグインはadd_menu_page()
関数を使用してPlugin Settings PageをSettings
メニューに追加する必要があります。
add_theme_page()
を使ってトップレベルのメニューを追加するのではなく、テーマはadd_menu_page()
関数を使ってAppearance
メニューにテーマ設定ページを追加するべきです。