ワードプレスのセキュリティーを向上させるためにSQLインジェクションを防ぐ方法を解説いたします。

SQLインジェクションとは?

ワードプレスのテキストデータや設定、ユーザーのログイン情報などは、データベースと言われる情報を効率的に保存、検索できるソフトウェアに記録されています。

SQLインジェクションとは、プログラムの隙(脆弱性)をついて、このデータベースのデータを不正取得したり、改ざんすることです。ワードプレスの改ざん(マルウェア)は主にファイルに感染することがほとんどですが、稀にこのデータベース関連の脆弱性が出ることがあり、その際はSQLインジェクションが使用される場合があります。

SQLインジェクションの例を見てみます。

$sql = "Select * from wp-user where id = '".$_REQUEST['userid']."'";

このコードはネットワークを通じて送信されたユーザーidのユーザーをデータベース上で選択するものですが、sqLインジェクションの脆弱性のあるコードです。

例えばハッカーがuserid という送信データに外部から下記のようなコードを挿入して送信することもできてしまいます。

=1';Update wp-user set パスワードのセル = '任意のパスワード' where id ='1

すると下記のような2つのつながったsql処理命令が実行されてしまいます。

Select * from wp-user where id = '1';Update wp-user set パスワードのセル = '任意のパスワード' where id ='1'

これは、無意味なデータベース選択処理と、管理者のパスワードを書き換えてしまうコードとなります。
問題は$_REQUEST[‘userid’] という外部送信データを、一つの変数として取り扱うようなエスケープ処理と言われる処理が入っていない事となります。

こういった脆弱性は、プラグインやテーマの更新でふさがれている場合が多いため、プラグインやテーマの更新を常に行うことがハッカーの攻撃を防ぐ有効な手段となります。

SQLインジェクションをHTACCESSの設定で防ぐ

このような単純なSQLインジェクション はHTACCESSである程度防ぐことが可能です。
下記の設定をHTACCESSに追加します。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (;|%22|%3D|%27).*(select|insert|union|declare|drop|update) [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>

この処理は、SELECT等のSQL文の実行処理が含まれる、外部送信されたデータを判定し(本来送信データはuseridのように単語でありSQL実行処理を含まないはずです)、事前に遮断します。

※このセキュリティー設定は、【無料】ワードプレス:マルウェアスキャン&セキュリティープラグイン [マルウェア・ウィルス検出と駆除] にて簡単にワードプレスの管理画面から行うことができます。またSQLインジェクションの脆弱性があるプラグインを調査いただくことも可能です。ぜひご利用ください。

WordPress ワードプレスのマルウェア駆除・復旧・修正のご依頼ご相談はWPドクターまでお気軽にお送りください