そんなことも知らずに開発とかしてたの?と言われるかも知れないけど、今後のためにもメモとして記録しておきます。
開発でやはり対策しておきたいことは、セキュリティー面。
以下のことは最低限しておいたほうがいいよということを今回学んだので忘れないようにメモ。
wp_nonce_fieldをつかう
nonceという言葉をWPでサイト構築するようになってずいぶん経つけど恥ずかしながら初めてしりました。
nonceはPOSTされ送られたデータが誠なものであるかを確認するためのものなんだとか。formから飛んでくるデータと合わせnonce情報も飛ばし、これがこのサイトで必要な誠な情報なのかという確認も含めると安全か判断できるというものだそう。
使いかたとしては、サイト内でフォームを利用してるところでformタグ内にwp_nonce_field()関数を使い、nonce用のフォームを追加します。
<?php wp_nonce_field( '_wpnonce', 'nonce', false ); ?> // 第一はアクション, 第二はnameの名前
// 生成されるinput
<input type="hidden" id="nonce" name="nonce" value="*********"> ****のところに文字列ができる
こうすることで、formタグ内にnonce用のinputタグが生成されます。
次に受け取る側のphpにもnonce用のソースを準備します。
$nonce = (isset($_REQUEST['nonce'])) ? $_REQUEST['nonce']: "";
if ( wp_verify_nonce( $nonce, '_wpnonce' )) { // wp_nonce_field()の第一引数と合わせる
if(!empty($_POST['data'])) {
// ポスト受信したときの処理
}
}
このようにすると、wp_verify_nonceで異と判断されるとPOST処理はされないということになります。
外部からの送信による不正から守られる仕組みになるようです。
直接アクセスを防ぐ
プラグインはwp-content > plugins フォルダに収められるため、基本的にプラグインがあるファイルまでのURLを入力すればアクセスが可能となっているんだそう。
そのプラグインがどのようなファイル群になっているかは公開しているものはいろいろと対策されていたり共有により多数の方の助言により対策されていたりとするものが多いが、個人で開発したものは対策が怠っていたり抜けがあったりと気づかないまま利用して、そこを不正でつつかれてしまうという事態も想定されます。
直接アクセスして内容がブラウザに表示されるのは非常にマズイので、最低限内容は表示しないような対策はしましょう。以下のソースを使用するファイルの最上部に配置しておきます。
if ( !defined('ABSPATH') ) {
die( 'Forbidden' );
}
これにより、WPからでないアクセスはその後の処理は行われないということになるんだそう。
その為、内容は表示されないという形になります。
関数の実行に必要な引数の情報などが分からないだけでもセキュリティ強化のひとつになると思います。
SQL文は$wpdb->prepare()を使う
WPが用意している関数だけでDBの操作が難しい場合、プラグイン独自のSQL文でDBにデータを保存したり取り出したりすることもありますが、もしポストデータを利用してSQL文を作成する場合、不正な入力によりDBデータを不正に扱われる可能性があります。そのような不正を防ぐ対策の一つとして、WPが用意しているprepare()を使ってセキュリティ的にも安全にデータベースとのやりとりを行うことができます。
$select = $wpdb->prepare("SELECT * FROM ".$_POST['data'].";");
$result = $wpdb->get_results($select);
こうすることでSQL文を安全にDBとのやりとりを行う文に変えてくれます。
細かな対策がセキュリティ強化につながるので、たとえ個人の開発とはいえ、いずれ仕事の一つとして利用されるかもと考えるのであれば対策作業は行っておきます。