脆弱性の種類
SQLインジェクション
SQLインジェクションは、入力された値が適切にサニタイズされていない場合に発生し、入力データ内のSQLコマンドが実行される可能性があります。これを防ぐために、WordPress APIは広範で、手動でSQLを介して投稿メタを追加する代わりに、add_post_meta();
のような関数を提供しています。
xkcd Exploits of a Mom
SQLインジェクションに対してテーマを強化するための最初のルールは、WordPressの関数がある場合はそれを使用することです。
しかし、時にはAPIで考慮されていない複雑なクエリを実行する必要があります。この場合は、常に$wpdb
関数を使用してください。これらは特にデータベースを保護するために構築されました。
SQLクエリ内のすべてのデータは、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)
) );
クロスサイトスクリプティング (XSS)
クロスサイトスクリプティング (XSS) は、悪意のある第三者がウェブページにJavaScriptを注入する場合に発生します。
出力をエスケープし、不要なデータを削除することでXSSの脆弱性を回避します。テーマの主な責任はコンテンツを出力することなので、テーマはコンテンツの種類に応じて適切な関数で動的コンテンツをエスケープする必要があります。
エスケープ関数の一例は、ユーザープロファイルからURLをエスケープすることです。
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />
HTMLエンティティを含むコンテンツは、指定されたHTML要素のみを許可するようにサニタイズできます。
$allowed_html = array(
'a' => array(
'href' => array(),
'title' => array()
),
'br' => array(),
'em' => array(),
'strong' => array(),
);
echo wp_kses( $custom_content, $allowed_html );
クロスサイトリクエストフォージェリ (CSRF)
クロスサイトリクエストフォージェリ、またはCSRF(シーサーフと発音)は、悪意のある第三者がユーザーを騙して、認証されたウェブアプリケーション内で望ましくないアクションを実行させる場合に発生します。たとえば、フィッシングメールには、WordPress管理者のユーザーアカウントを削除するページへのリンクが含まれている可能性があります。
テーマにHTMLまたはHTTPベースのフォーム送信が含まれている場合は、ノンスを使用して、ユーザーがアクションを実行する意図があることを保証してください。
<form method="post">
<!-- some inputs here … -->
<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>
最新情報を保つ
潜在的なセキュリティホールについて最新の情報を保つことが重要です。以下のリソースは良い出発点を提供します: