一般的な脆弱性
セキュリティは常に変化する状況であり、脆弱性も時間とともに進化します。以下は、保護すべき一般的な脆弱性の概要と、テーマを悪用から守るための技術です。
クロスサイトスクリプティング (XSS)
クロスサイトスクリプティング (XSS) は、悪意のある第三者がウェブページにJavaScriptを注入する際に発生します。
XSSの脆弱性を回避するためには、すべての出力をエスケープする必要があります。テーマの主な責任はコンテンツを出力することなので、データ型に基づいて適切な関数を使用して常に 動的コンテンツをエスケープする べきです。
この例は、XSSの脆弱性を回避するために画像URLをエスケープする方法を示しています:
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />
HTMLエンティティを含むコンテンツは、指定されたHTML要素のみを許可するようにサニタイズできます:
$allowed_html = array(
'a' => array(
'href' => array()
),
'br' => array(),
'em' => array(),
'strong' => array()
);
echo wp_kses( $custom_content, $allowed_html );
SQLインジェクション
SQLインジェクションは、入力される値が適切にサニタイズされていない場合に発生し、データ内のSQLコマンドが実行される可能性があります。これを防ぐために、WordPress APIは非常に広範です。たとえば、メタデータをSQL経由で手動で挿入する必要がないように、add_post_meta()
のような関数を提供しています。
SQLインジェクションからテーマを強化するための最初のルールは: WordPressの関数がある場合は、それを使用すること。
テーマでは稀ですが、APIで考慮されていない複雑なクエリを実行する必要がある場合があります。その場合は、常に $wpdb
関数を使用してください。これらはデータベースを保護するために特別に作られました。
SQLクエリ内のすべてのデータは、SQLインジェクション攻撃を防ぐためにSQLエスケープされなければなりません。SQLエスケープに最適な関数は $wpdb->prepare()
で、sprintf()
のような構文と vsprintf()
のような構文の両方をサポートしています:
$wpdb->get_var( $wpdb->prepare(
"SELECT something FROM table WHERE foo = %s and status = %d",
$name, // an unescaped string (function will do the sanitization for you)
$status // an untrusted integer (function will do the sanitization for you)
) );
クロスサイトリクエストフォージェリ (CSRF)
クロスサイトリクエストフォージェリ、またはCSRF(シーサーフと発音)は、悪意のある第三者がユーザーを騙して、認証されたウェブアプリケーション内で望ましくないアクションを実行させることです。たとえば、フィッシングメールには、WordPress管理者のユーザーアカウントを削除するページへのリンクが含まれている場合があります。
これはテーマよりもプラグインで一般的です。しかし、テーマにHTMLまたはHTTPベースのフォーム送信が含まれている場合は、ノンスを使用して、ユーザーがアクションを実行する意図があることを保証してください:
<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>
リソース
以下のリソースを使用して、テーマ、プラグイン、およびWordPressの上に構築するその他のもののセキュリティを深く掘り下げてください:
- 一般的なAPIハンドブック: セキュリティ
- テーマ作成: セキュアなテーマを書くためのガイド:
最新情報を保つ
潜在的なセキュリティホールについて最新の情報を保つことが重要です。以下のリソースは良い出発点を提供します: