WordPress の脆弱性を解決するための 5 つの最善の方法

公開: 2020-02-01

現在、WordPress は Web の 33% をカバーしています。 これは、膨大な数のユーザーがそれを使用していることを意味し、間違いなくより多くの攻撃者やハッカーを引き付けます. このため、SQL インジェクション攻撃、リダイレクト攻撃、CSRF 攻撃、XSS 攻撃など、WordPress の脆弱性を引き起こす脅威や攻撃が増えています。 このため、これは WordPress が安全ではないという意味ではありません。 WordPress を安全にするために、データのサニタイズ、データの検証、データのエスケープ、ナンスの使用と検証、安全なリダイレクト、ユーザー機能などに焦点を当てる必要があります。 ただし、WordPress の脆弱性により安全性が低下します。 それでは、WordPress のセキュリティの問題について説明しましょう。

脆弱性は WordPress にも発生します。 しかし、どのように?

一方では、 WordPress の脆弱性による大きな脅威と攻撃があります。 一方、WordPress の開発中は、コードを使用してこれらの攻撃を克服または防止する必要があります。

あなたが WordPress 開発者でなくても、この投稿を読むことをお勧めします。なぜなら、あなたのサイトを攻撃するハッカーを引き付ける主要な攻撃を知ることができるからです. また、不十分にコード化されたプラグインと WordPress のテーマを知る方法も理解できるようになります。 オンライン ショップを運営している場合は、安全な最高の WooCommerce プラグインとテーマを決定すると便利です。

コンテンツ
1 WordPress のセキュリティ脆弱性
2脅威と攻撃
2.1 WordPress の脆弱性 – SQL インジェクション攻撃
2.2データのサニタイズ
2.2.1データ無害化の例:
2.3 WordPress の脆弱性 – XSS 攻撃
2.3.1 XSS 攻撃の例:
2.4データ検証
2.4.1データ検証の例:
2.5データエスケープ
2.5.1データエスケープの例:
2.6 WordPress の脆弱性 – CSRF 攻撃
2.7ノンスの使用
2.8ノンスの検証
2.9 WordPress の脆弱性 – リダイレクト攻撃
2.10安全なリダイレクト
2.11ユーザー機能の脆弱性
2.12 WordPress で常に戻るか終了する

WordPress のセキュリティ脆弱性

脆弱なコードはどこから来るのですか?

まず、 WordPress のセキュリティの問題がどこにあるのかをよく理解する必要があります。 WordPress は、WordPress のコア コード、テーマ、および Php、Html、javascript およびその他のコードを含むプラグインで構成されています。

オープンソース コミュニティは、WordPress コア コードを検査します。 バグを報告し、脆弱性を修正し、その功績を認める人は非常に多くいます。 WordPress の脆弱性は、SQL インジェクション攻撃、CSRF 攻撃、XSS 攻撃、リダイレクト攻撃、およびその他の同様の手法によって悪用される可能性があります。 したがって、WordPress コア開発からの脆弱性はそれほど多くありません。

通常、テーマは wp データベースとやり取りすることも、サイトが頻繁にテーマを変更することもありません。 Gutenberg は WordPress のデフォルトのエディターであるため、パフォーマンスとセキュリティを向上させるために、Gutenberg 互換の WordPress テーマを選択する必要があります。 そのため、脆弱性の発生は少なくなります。

一方、WordPress プラグインには複雑な機能と動作があります。 また、ユーザーやデータベースとの交流も盛んです。 このサイトには、外部機能を持つ多数のプラグインが含まれています。 その結果、サイトに多数の脆弱性がもたらされる可能性があります。 プラグインは、WordPress に重大な脆弱性をもたらします。

WordPress の脆弱性 - 脅威と攻撃
WordPress の脆弱性 – WPscan.org

wpscan.org によると、脆弱性の 11% はテーマに起因しており、脆弱性の 37% は WordPress Core 開発に起因しています。 同様に、残りの 52% はプラグインによるものです。 WordPressプラグインとは何かをすでに知っていると思います

脅威と攻撃

あなたが WP テーマまたはプラグインの開発者である場合、コードを安全にし、WordPress の脆弱性を軽減するために、脅威と攻撃について十分な知識が必要です。

脅威と攻撃-SQL インジェクション-XSS-CSRF-リダイレクト
脅威と攻撃

SQL インジェクション攻撃、XSS 攻撃、リダイレクト攻撃、CSRF 攻撃など、データのサニタイズ、データの検証、データのエスケープ、ナンスの使用と検証、安全なリダイレクト、ユーザー機能などによって防ぐことができる多くの攻撃があります。

開発者にとって、敵は通常、悪意のあるユーザーです。 そのようなユーザーは私たちのコードに損害を与えます。 ユーザー入力を信頼しないことを日常のコーディング行動に組み込むと、WordPress のセキュリティ問題を軽減するためのより安全なコードを作成するための半分がすでに作成されています。 これにより、WordPress カスタマイザーとしての作業が容易になります。

WordPress の脆弱性 – SQL インジェクション攻撃

重要で機密性の高いデータを取得しようとして、SQL インジェクション攻撃は悪意のある SQL コードを WP データベースに挿入します。 それらは、SQL データベース (MySQL、Oracle、SQL Server など) を使用する WordPress サイトをターゲットにしています。

この意図により、データを簡単に追加、編集、または読み取ることができるため、パスワード、電子メールアドレス、または機密データにアクセスできます。

有名な「Bobby Tables」コミックの例を取り上げることができます。

有名なボビー テーブル コミック - 脅威と攻撃
有名なボビー テーブル コミック

このコミックでは、女性が息子の名前「ロバート」を保持しています)。 DROP TABLE 学生; –')'; 名前がサニタイズされていない場合、データベースに入力すると、学校の学生テーブル全体が削除されるSQLコマンドを使用します。

したがって、SQL インジェクションを回避するには、ユーザー入力データをサニタイズする必要があります。

データのサニタイズについて詳しく説明しましょう。

データサニタイズ

サニタイズとは、入力を保護し、ユーザー入力をきれいにすることを意味します。 このプロセスは、無効なテキスト、UTF-8 文字、またはコードを入力から削除して、WordPress の脆弱性を軽減します。

HTML 固有の文字をエンティティに変換し、すべてのタグを取り除きます。 また、WordPress の主要なセキュリティ問題の原因である改行、タブ、余分な空白、ストリップ オクテットも削除します。

データをサニタイズするための WordPress 組み込み関数がたくさんあります。 それらのいくつかは以下のリストにあります:

  1. sanitize_email(): メールに含まれてはならないすべての文字を取り除きます
  2. sanitize_text_field(): 文字列をサニタイズします (ユーザー入力/データベースから)
  3. sanitize_file_name(): 文字を削除します (ファイル名から)
  4. sanitize_key(): 小文字の英数字、ダッシュ、およびアンダースコアを除くキーを取り除きます。

データ無害化の例:

 $title=sanitize_text_field($_POST['title']); update_post_meta($post->ID,'title',$title);

ここでは、最初に、タイトルをサニタイズしています。 サニタイズ後、wp データベースのタイトル値を更新しています。

 $Name= ' Robert'); DROP TABLE Students; --') '; INSERT INTO Students VALUES ('$Name'); INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --')

上記の SQL コマンドでは、名前に文字列と特殊文字とエンティティが含まれており、学生テーブルに挿入された名前 'Robert'); これにより、insert SQL コマンドが閉じられ、DROP TABLE Students という名前の半分で別のコマンドが実行されます。 –')'; このドロップテーブルの学生は、データベースのすべての学生レコードを削除します。

したがって、ここでデータベースに値を入力する前にサニタイズが行われていれば、学生データベース テーブル全体が失われることはありません。

サニタイズを行うために、以下の例を見てみましょう。


 $Name=sanitize_text_field("' Robert'); DROP TABLE Students; --') ';"); $sql = $wpdb->prepare("INSERT INTO Students VALUES ($Name)"); /* this will only insert 'Robert DROP TABLE Students' */ $wpdb->query($sql);

上記の例では、サニタイズによって余分なエンティティと文字が名前から削除され、文字列のみがデータベースに挿入されます。 このようにして、データを安全に挿入し、SQL インジェクションから安全にすることができます。

入力の保護について詳しくは、このリンクをたどってください。

WordPress の脆弱性 – XSS 攻撃

クロスサイト スクリプティング (XSS) 攻撃は、脆弱なスクリプト言語の JavaScript コードを挿入して、Cookie、セッション トークン、その他の情報など、他のユーザーの同様のデータを盗みます。 Cookie 情報があれば、自動的に接続できます。 WordPress のセキュリティ問題には、盗まれた Cookie が伴います。これは、他の ID で簡単にログインできるためです。
ブラウザ上で動作します。 サイトを閲覧している何百万人もの人々が、この攻撃の影響を受けます。 間違いなく、この攻撃は最も深刻な攻撃の 1 つです。

XSS 攻撃の例:

 <script <script type=”text/javascript”>
var hacker ='../hacker.php? cookie_data=' +escape(document.cookie);
</script>
</script>

この XSS 攻撃の例では、Cookie がエスケープされ、hacker.php スクリプトの変数「cookie_data」に送信されます。

攻撃者がこのスクリプトを Web サイトのコードに挿入すると、ユーザーのブラウザでスクリプトが実行され、Cookie が攻撃者に送信されます。これは危険な問題です。 したがって、これを回避するには、検証する必要があります。 すべてのユーザー入力データを検証してサニタイズし、出力データをエスケープします。

以下で詳しく議論しましょう。

データ検証

検証とは、ユーザー入力のチェックです。 これは、ユーザーが有効な値を入力したかどうかを確認するために行われます。
データを検証するには、PHP の組み込み関数、WordPress のコア関数、カスタム関数の 3 つの方法があります。 WordPress の脆弱性を回避するために、これを決してエスケープしないでください。 それらのいくつかは以下のリストにあります:

  1. isset()/empty(): 変数が存在するかどうかを確認します
  2. is_email(): 指定されたデータが電子メール形式かどうかを確認します
  3. is_serialized(): 値が文字列かどうかをチェック

データ検証の例:

 $number='12323'; if(intval(number)){ //do your things } else{ esc_html_e('Enter valid number','text-domain'); }

上記の例では、入力データが数値かどうかをチェックし、数値の場合にのみプログラムを実行します。 したがって、データ検証は、WordPress のセキュリティ問題を軽減するのに役立ちます。

データ検証の詳細については、このリンクをたどってください

データエスケープ

エスケープは出力を確保することです。 これは、不正な HTML やスクリプト タグなどの不要なデータを取り除くプロセスです。 エスケープは、特別な HTML 文字を HTML エンティティに変換するだけでなく、実行ではなく表示も行います。 これは、XSS 攻撃を防ぎ、データがユーザーの期待どおりに表示されるようにするために行われます。
WordPress にはいくつかのヘルパー関数が用意されています。 ほとんどの場合に使用されます。 それらのいくつかは次のとおりです。

  1. esc_html(): HTML 固有の文字をエスケープします
  2. esc_attr(): HTML タグ属性の値をエスケープします
  3. esc_url(): ハイパーテキストのREFerence属性をエスケープします

データエスケープの例:

 $url = "javascript : alert ('Hello')";
<a href= "<?php echo esc_url ($url) ;?>"> Text </a> href= "<?php echo esc_url ($url) ;?>"> Text </a>

上記の例では、ハッカーはスクリプト言語コードを入力して、WordPress サイトのセキュリティ問題に挑戦しています。 これを避けるために、esc_url を使用して URL 値をエスケープし、その後はコードで値をエコーし​​ています。 このようにして、XSS 攻撃を防ぎました。

WordPress の脆弱性 – CSRF 攻撃

WordPress の脆弱性でさらに議論すると、クロスサイト リクエスト フォージェリ攻撃は、ワンクリックの脅威と攻撃またはセッション ライディング攻撃です。
CSRF 攻撃により、攻撃者は、ログインしているユーザーに、同意または知らないうちに重要なアクションを強制的に実行させることができます。
ここでは、許可されたユーザーが許可されていないコマンドを送信します。
これは、特定のページまたは URL に送信された許可されたユーザーが、自分が行ったことに気付いていないことを実行できる可能性があるという考えに依存しています。 さらに、nonce と verify nonce を使用して修正することもできます。

ナンスの使用

WP はナンスと呼ばれるセキュリティ トークンを生成します。 これは、特定の操作に使用できる、繰り返されないあなただけの一意の番号です。 nonce 値は 24 時間有効で、その後有効期限が切れ、wp によって新しい値が生成されます。 ナンスの検証時間も設定できます。
URL とフォームを誤用から保護し、WordPress の既存のセキュリティ問題を軽減します。

さらに、nonce でフォームを保護するために、 wp_nonce_field() 関数を使用して非表示の nonce フィールドを作成します。

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

以下は、ナンスのいくつかの関数です。

  1. wp_nonce_url() – URL に nonce を追加します。
  2. wp_create_nonce() – AJAX リクエストを処理するために独自の方法で nonce を使用します。

ノンスの検証

  1. check_ajax_referer() – nonce をチェックします (リファラーはチェックしません)。チェックが失敗すると、デフォルトでスクリプトの実行が終了します。
  2. wp_verify_nonce() – ノンスを検証します。
 if(isset($_POST['name_of_nonce_field']) && wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action')){ //do something } else{ esc_html_e('Sorry,your nonce did not verify.','text-domain'); }

ノンスの詳細については、このリンクをたどってください

WordPress の脆弱性 – リダイレクト攻撃

また、WordPress の脆弱性により、サイト訪問者が悪意のある Web サイトに自動的にリダイレクトされます。
これは通常、訪問者が要求したページまたは Web サイトではなく、他のページにリダイレクトした場合に発生します。
サイトのトラフィックが多い場合、この攻撃により、サイトへのトラフィックが減少する可能性があります。 サイトの訪問者が他のページにリダイレクトされることにさえ気付かないでしょう. ただし、セーフ リダイレクトの助けを借りて修正できます。

安全なリダイレクト

ユーザーを任意のページにリダイレクトする場合は、アクションまたはフォームの後、wp_safe_redirect を使用します。 wp_safe_redirect は許可されたホストをチェックします。 ホストが許可されていない場合は、サイトの URL にリダイレクトされます。 したがって、別のホストへの悪意のあるリダイレクトを防ぎます。 ただし、これは wp_redirect によってチェックされません。 したがって、WordPress のセキュリティ問題を軽減するには、wp_safe_redirect を使用する方が安全にリンクをリダイレクトできます。

 $redirect=admin_url('edit.php'); wp_safe_redirect($redirect);

ユーザー機能の脆弱性

リダイレクト攻撃、XSS 攻撃、CSRF 攻撃、SQL インジェクション攻撃に加えて、WordPress はユーザー機能からも脆弱です。 ユーザーがサイトにアクセスしてデータを送信できるようにする場合は、ユーザーの機能を確認してください。 そうしないと、脅威や攻撃の犠牲になります。
ユーザーの役割が高いほど、ユーザーはより多くの機能を持ちます。
開発者は、フォームを送信するページにいるユーザーがアクションを実行するために必要な権限を持っているかどうかを確認するのを忘れていることがあります。 WordPress の脆弱性の共通の原因となります。

 if ( current_user_can( 'edit_posts' ) ) { edit_post_link( esc_html__( 'Edit', 'wporg' ), '', ''); }

Contact Form 7 の脆弱性の例を見てみましょう (WordPress 脆弱性のタイプ)

このプラグインのアクティベーション数は 500 万ユーザー以上です。 脆弱なコードが 1 つでもあれば、500 万人以上の人々に影響が及びます。

権限の脆弱性 - Contact Form 7
Contact Form 7 の権限脆弱性

5.0.3 以前のバージョンには機能の脆弱性がありました。 Contributor ロールでログインしているユーザーは、連絡先フォームを簡単に編集できます。 デフォルトでは、管理者および編集者ロールのユーザーのみがアクセスできました。
そのため、ハッキングされる可能性が高くなりました。 プラグインの新しいバージョンでは、これらのエラーが解決されています。

WordPress では常に戻るか終了する

関数または ajax 呼び出しを作成しているときに、コードの完了後にリターンを逃したか、死亡した場合。 簡単に見えるかもしれませんが、重要なセキュリティ問題につながる可能性があります。

意図した場所に常に return と die を追加していることを確認してください。 Apple の #gotofail バグの例を挙げることができます。

 defined( 'ABSPATH' ) defined( 'ABSPATH' ) or die ( "No script kiddies please!" );
function function adls_view() { global $wpdb; { global $wpdb;
            include( 'inc/frontend/smls-detail/smls-grid-inline.php' );
           exit(); }
function function adls_generate_random_string ( $length ){
           $string = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $random_string = '';
            for ( $i = 1; $i <= $length; $i ++ ) { { $random_string .= $string[ rand( 0, 61 ) ];
            }
           $random_string; return
       }
 }

まとめ

これは、セキュリティを気にする WordPress プロフェッショナルにとって重要な投稿でした。 この投稿から、WordPress に脆弱性をもたらすさまざまな脅威と攻撃について学びました。 SQL インジェクション攻撃、XSS 攻撃、CSRF 攻撃、リダイレクト攻撃などに関する簡単な紹介が含まれています。

検証-サニタイズ-エスケープ-ナンス
覚えておくべきポイント

データのサニタイズ、データの検証、データのエスケープ、ナンスの使用と検証、安全なリダイレクト、ユーザー機能などのさまざまな手法についても説明されました。 このため、WordPress にはセキュリティ上の問題があります。

結論として

  1. WordPress の脆弱性を回避するために、ユーザー入力を決して信用しないでください。
  2. すべての入力を検証してサニタイズし、すべての出力データをエスケープします
  3. WordPressを信頼しましょう!

上記の脅威や攻撃に関する問題に直面した場合は、お知らせください。 当社の専門家が、お客様の問題に基づいて適切なソリューションを提供します。