ワードプレスでSQLインジェクションを防ぐPHPプログラミングの小技をご紹介いたします。
SQLインジェクションとは?
SQLインジェクションとは、データベースから情報を引き出す際のSQL文に不正な文字列を与えて、意図しない情報を引き出したり、データベースに不正なデータを書き込むハッキング手法です。
"SELECT * FROM users WHERE email = '".$_GET['email']."'"
例えば上記のようなコードがワードプレスに含まれていた場合、ハッカーがブラウザーからデータを送り込んで
SELECT * FROM $wpdb->users WHERE email = 'aaa@aaa.com' or 1 = 1
のようなSQL文を実行させてしまうことが可能です。この場合1=1は常に真になるため、全ユーザーの情報が引き抜かれる可能性もございます。
ワードプレスでSQLインジェクションを防ぐPHPプログラミングの書き方
SQL文特有の処理文字を単なる文字列として変換する、エスケープと呼ばれる処理をはさむと、SQL文の処理自体を不正に実行することが困難になります。
ワードプレスには組み込みのSQL文のエスケープ関数であるesc_sqlという処理があります。
実行不可能な文字列に変換された文=esc_sql($_GET['email']);
そのほか、Prepareという処理で、文字列や数字を明示的に指定して、SQL文を置き換える方法でもSQLインジェクションを防ぐことが可能です。
エスケープされたSQL文=$wpdb->prepare( "SELECT * FROM $wpdb->users WHERE email = %s or ID = %d", $_GET['email'], $_GET['id'] )
prepare によって %s が単なる文字列として第一因数の$_GET[’email’]でエスケープされて代入され、%dが数として$_GET[‘id’]エスケープされて代入されます。