一般的な脆弱性

2020.04.07 2020.04.07

TOPICS

翻訳元記事はこちらです。

セキュリティは常に変化し続けるものであり、脆弱性は時とともに進化していきます。ここでは、守るべき一般的な脆弱性と、テーマを悪用されないように守るためのテクニックを紹介します。

脆弱性の種類

SQLインジェクション

SQL インジェクションは、入力された値が適切にサニタイズされていない場合に発生し、入力されたデータに含まれる SQL コマンドが実行される可能性があります。これを防ぐために、WordPress の API は豊富で、add_post_meta() のような関数を提供しています。

この関数を使わない場合は、SQL (INSERT INTO wp_postmeta…) を使って手動で投稿のメタフィールドを追加する必要があります。

テーマを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) は、悪意のある者が Web ページに 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)

クロスサイトリクエストフォージェリ(Cross-site request forgery)または CSRF(シーサーフと発音)とは、悪徳業者がユーザーを騙して、ユーザーが認証されたウェブアプリケーション内で望ましくないアクションを実行させることです。例えば、フィッシングメールには、WordPress の管理画面でユーザーのアカウントを削除するページへのリンクが含まれている場合があります。

テーマに HTML や HTTP ベースのフォーム送信が含まれている場合は、ユーザーがアクションを実行する意思があることを保証するために nonce を使用します。

<form method="post">
   <!-- some inputs here ... -->
   <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>